标签: rust-bindgen

尝试 Bindgen 教程时看到 bzlib.h 未找到

我知道有一篇与此类似的帖子,但我关注了它,但我仍然看到这个问题,所以我想我会再次询问,抱歉。我下载了 bbindgen-tutorial-bzip2-sys 并尝试运行它,但出现以下错误

  wrapper.h:1:10: fatal error: 'bzlib.h' file not found
  wrapper.h:1:10: fatal error: 'bzlib.h' file not found, err: true
Run Code Online (Sandbox Code Playgroud)

另一位用户建议降级 .toml 中的 Bindgen 版本,我尝试了,但仍然看到问题,我还验证了 bzip2 是否已安装。

是否有已知的 clang 版本可与 Bindgen 配合使用?

谢谢

-------------------------------------------------- - - -更新 - - - - - - - - - - - - - - - - - - - - - - ----------------------

因此,我安装了 dev bzip 文件,并通过将路径添加到 LD_LIBRARY_PATH 然后使用 ldconfig 进行更新来验证该库是否位于 ld 查看的文件夹中。我现在可以在运行 CARGO BUILD 时进行编译,

fred@fred-MS-7B06:~/rust_projects/bindgen-tutorial-bzip2-sys-master$ cargo build
    Finished dev [unoptimized + debuginfo] …
Run Code Online (Sandbox Code Playgroud)

rust rust-bindgen

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

如何在 Rust 中获取结构体字段的大小而不实例化它

我有一个包含字节数组的结构。这个结构实际上来自bindgen生成的FFI绑定,它的大小是使用宏在C代码中定义的,即:

C代码:

#define FOO_SIZE 100

struct the_struct
{
    char foo[FOO_SIZE];
    /* other fields... */
};
Run Code Online (Sandbox Code Playgroud)

生成的 FFI 绑定:

pub struct the_struct {
    pub foo: [::std::os::raw::c_char; 100usize],
    // other fields...
}
Run Code Online (Sandbox Code Playgroud)

我想确保来自 Rust API 端的数据适合foo. 我也不想FOO_SIZE在 Rust API 中进行硬编码,因为它可能会发生变化。

我知道这可以通过首先实例化结构来完成,但话又说回来,这需要显式初始化foo,这在不知道其大小的情况下似乎是不可能的。此外,这是我想避免的额外步骤。

foo是否可以在不实例化结构的情况下以某种方式静态获取大小?如果不是,最好的方法是什么?更改 C 代码不是一个选项。

ffi rust rust-bindgen

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

rust-bindgen 未定义符号,但可以使用 cc 编译

我正在尝试使用 rust-bindgen 来调用 glfw 和 OpenGL 函数。bindgen 正确生成了绑定,但是,当我实际构建项目时,它给了我未定义的符号错误(顺便说一句,我运行的是 macOS 10.15.3)。

\n

这似乎意味着我没有告诉 rustc 链接 glfw dylib。然而,当我编写自己的 c 程序在内部调用 glfw 并使用 cc 板条箱链接它时,没有问题,并且所有内容都链接,尽管链接库的行是相同的。

\n

使用bindgen的项目代码

\n

文件结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wrapper.h\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 target\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 debug\n     \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 build\n     \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bindgen-opengl-10578485537ed6e1\n     \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 out\n     \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0  \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bindings.rs\n\n
Run Code Online (Sandbox Code Playgroud)\n

包装器.h:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wrapper.h\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 target\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 debug\n     \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 build\n     \xc2\xa0\xc2\xa0 …
Run Code Online (Sandbox Code Playgroud)

c linker rust rust-cargo rust-bindgen

6
推荐指数
0
解决办法
1600
查看次数

如何在 Rust 中正确包装 C 函数指针?

我有一个Foo带有函数指针的 C 结构。在我的 Rust 绑定中,我希望允许用户设置此函数指针,但我希望避免用户必须处理 FFI 类型。

foo.h

struct Foo {
  void*   internal;
  uint8_t a;
  void (*cb_mutate_a)(void*);
};

struct Foo* foo_new();
void        foo_free(struct Foo* foo);
void        foo_call(struct Foo* foo);
Run Code Online (Sandbox Code Playgroud)

foo.c

struct Foo* foo_new() {
  return calloc(1, sizeof(struct Foo));
}

void foo_free(struct Foo* foo) {
  free(foo);
}

void foo_call(struct Foo* foo) {
  return foo->cb_mutate_a(foo->internal);
}
Run Code Online (Sandbox Code Playgroud)

我当前的解决方案是创建一个 Rust 结构体Bar,它有一个指向 bindgen 生成的 C struct 的指针foo_sys::Foo,并且在其中我有一个特征对象 ( rust_cb),它是我想在 Rust API 中公开的实际回调。我将 C 设置cb为指向 awrapped_cb …

c ffi rust rust-bindgen

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

如何将 bindgen 生成的 C 样式枚举转换为另一个枚举?

我正在为 C 库和 Bindgen 生成的枚举在 Rust 中创建绑定,例如:

// Rust
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rmw_qos_history_policy_t {
    RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT = 0,
    RMW_QOS_POLICY_HISTORY_KEEP_LAST = 1,
    RMW_QOS_POLICY_HISTORY_KEEP_ALL = 2,
    RMW_QOS_POLICY_HISTORY_UNKNOWN = 3,
}
Run Code Online (Sandbox Code Playgroud)

我需要将这些转换为:

// Rust
pub enum QoSHistoryPolicy {
    SystemDefault = 0,
    KeepLast = 1,
    KeepAll = 2,
    Unknown = 3,
}
Run Code Online (Sandbox Code Playgroud)

从这个 C 库导入常量值时:

// Rust
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rmw_qos_history_policy_t {
    RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT = 0,
    RMW_QOS_POLICY_HISTORY_KEEP_LAST = 1,
    RMW_QOS_POLICY_HISTORY_KEEP_ALL = 2,
    RMW_QOS_POLICY_HISTORY_UNKNOWN = 3,
} …
Run Code Online (Sandbox Code Playgroud)

enums rust rust-bindgen

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

如何向另一个线程发送指针?

我使用bindgen为相机的C++库创建了一个Rust包装器,并且C++库中的相机句柄定义为typedef void camera_handlebindgen移植的:

pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)

我能够成功连接到相机并拍摄图像,但是我想在单独的线程上运行代码来控制相机的温度,本质上是根据相机的当前温度改变冷却器功率,我想要与其余代码分开运行。这些调用需要相机句柄,但是当我生成新线程时,我不断收到错误:

pub type camera_handle = ::std::os::raw::c_void;
Run Code Online (Sandbox Code Playgroud)

在它的下面,它提到:

'*mut std::ffi::c_void' cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)

如何将其发送到另一个线程,以便我也可以在那里使用该相机手柄?我尝试过使用脆弱send_wrapper,但两者都没有成功。

c++ ffi void-pointers rust rust-bindgen

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

如何使用 rust bindgen 生成的 std_vector

我有一个外部 C++ 库,我想从 rust 中使用它。为此,我使用 bindgen 来映射函数调用。我想要使​​用的 C++ 函数填充 (C++) 字符串向量并具有签名:

short REQ_MList(std::vector<std::string> *list)
Run Code Online (Sandbox Code Playgroud)

Bindgen 生成 Rust 函数:

pub fn REQ_MList(list: *mut std_vector) -> ::std::os::raw::c_short
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何处理这个数据类型std_vector。

我尝试生成 std​​_vector 结构并提供指向它的原始指针,该指针可以编译但(当然)失败。

let mut list=std_vector{_Mypair: (0)};
let list_ptr:*mut std_vector= &mut list;
REQ_MList(listptr);
Run Code Online (Sandbox Code Playgroud)

处理此 C++ 数据类型的正确方法是什么?我还没有找到任何关于这个主题的文档。

c++ vector rust rust-bindgen

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

标签 统计

rust ×7

rust-bindgen ×7

ffi ×3

c ×2

c++ ×2

enums ×1

linker ×1

rust-cargo ×1

vector ×1

void-pointers ×1