Rust FFI 编程工具 - bindgen
预备知识
快速开始
安装 bindgen
cargo install bindgen
使用 bindgen
C 文件
新建 C 头文件
cool.h
typedef struct CoolStruct {
int x;
int y;
} CoolStruct;
void cool_function(int i, char c, CoolStruct* cs);
使用 bindgen 将 C 头文件转换为 Rust 代码
bindgen cool.h -o bindings.rs
在 Windows 系统下可能会产生如下错误
thread 'main' panicked at 'Unable to find libclang: "couldn't find any valid shared
libraries matching: ['clang.dll', 'libclang.dll'], set the `LIBCLANG_PATH` environm
ent variable to a path where one of these files can be found ...
原因是缺少 Clang 依赖, 可以通过 Visual Studio 2019 安装相关开发工具, 注意勾选如下内容
然后添加环境变量 LIBCLANG_PATH
, 设置为 Clang 的安装路径, 默认为
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\x64\bin
注意
不要添加成 32 位的路径
重新运行 bindgen 命令, 如果不出错则会产生如下 Rust 代码
bindings.rs
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct CoolStruct {
pub x: ::std::os::raw::c_int,
pub y: ::std::os::raw::c_int,
}
extern "C" {
pub fn cool_function(i: ::std::os::raw::c_int, c: ::std::os::raw::c_char, cs: *mut CoolStruct);
}
C++ 文件
bindgen 默认只能解析 C 文件, 如果要解析 C++ 文件需要额外添加 clang 参数 -x c++
, 可在 bindgen 命令行中双横线 --
后传递给 clang
foo.h
class Foo {
public:
Foo(int x);
};
Foo::Foo(int x) {}
bindgen foo.h -o bindings.rs -- -x c++