跳到主要内容

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 安装相关开发工具, 注意勾选如下内容

img

然后添加环境变量 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++

参考