相关疑难解决方法(0)

使用Rust FFI时如何初始化不透明的C结构?

这是我想用C代码做的事情:

#include <some_lib.h>
int main() {
    some_lib_struct_t x;
    some_lib_func(&x);
}
Run Code Online (Sandbox Code Playgroud)

如何在Rust中使用库?这是我到目前为止所得到的:

extern crate libc; // 0.2.51

struct some_lib_struct_t;

#[link(name = "some_lib")]
extern "C" {
    fn some_lib_func(x: *mut some_lib_struct_t);
}

fn main() {
    let mut x: some_lib_struct_t;
    unsafe {
        some_lib_func(&mut x);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时我(不是那么令人惊讶)得到错误:__CODE__.

编辑

在阅读Shepmaster的回答后,我仔细查看了图书馆的标题.就像他们说的那样,__CODE__只是一个指向的指针的typedef __CODE__.我做了以下更改:

error[E0381]: borrow of possibly uninitialized variable: `x`
  --> src/main.rs:13:23
   |
13 |         some_lib_func(&mut x);
   |                       ^^^^^^ use of possibly uninitialized `x`
Run Code Online (Sandbox Code Playgroud)

它的工作原理!但是我收到了警告__CODE__.这是我可以压制的东西还是我需要改变一些东西?

ffi rust

9
推荐指数
1
解决办法
1963
查看次数

什么是Rust惯用法来定义指向C透明指针的字段?

给定一个结构:

#[repr(C)]
pub struct User {
    pub name: *const c_char,
    pub age: u8,
    pub ctx: ??,
}
Run Code Online (Sandbox Code Playgroud)

该字段ctx只能由C代码操作;它是C结构的指针UserAttr

根据Rust FFI文档,该选择将定义为不透明类型pub enum UserAttr {}。但是,我发现Rust无法复制其值,例如,为什么对象的地址在方法之间会发生变化

在Rust中定义这样一个不透明指针的正确方法是什么,以使它的值(作为指针)跨方法复制?

rust

1
推荐指数
1
解决办法
1190
查看次数

通过 Rust FFI 更改 C 数组元素

我正在使用 Rust 来测试一些 C 代码:

哈哈

#include "lol.h"
int a[10]; //Assume lol.h has an extern declaration for a[10]
Run Code Online (Sandbox Code Playgroud)

库文件

extern "C" {
    static a: *mut i32;
}

fn set_a(val: i32, index: usize) {
    assert!(index < 10);
    unsafe {
        a[index] = val;
    }
}

fn get_a(index: usize) {
    assert!(index < 10);
    unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)

我使用cc crate来编译和链接 lol.o。set_aget_a函数怎么写?编译器说:

extern "C" {
    static a: *mut i32;
}

fn set_a(val: i32, index: usize) {
    assert!(index < …
Run Code Online (Sandbox Code Playgroud)

ffi rust

0
推荐指数
1
解决办法
800
查看次数

标签 统计

rust ×3

ffi ×2