我知道有一篇与此类似的帖子,但我关注了它,但我仍然看到这个问题,所以我想我会再次询问,抱歉。我下载了 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) 我有一个包含字节数组的结构。这个结构实际上来自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 代码不是一个选项。
我正在尝试使用 rust-bindgen 来调用 glfw 和 OpenGL 函数。bindgen 正确生成了绑定,但是,当我实际构建项目时,它给了我未定义的符号错误(顺便说一句,我运行的是 macOS 10.15.3)。
\n这似乎意味着我没有告诉 rustc 链接 glfw dylib。然而,当我编写自己的 c 程序在内部调用 glfw 并使用 cc 板条箱链接它时,没有问题,并且所有内容都链接,尽管链接库的行是相同的。
\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\nRun 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) 我有一个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 库和 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) 我使用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++ 库,我想从 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++ 数据类型的正确方法是什么?我还没有找到任何关于这个主题的文档。