链接

2 文章

build.rs、link 和 pkg-config

4 分钟

写 FFI 时,声明 C 函数只是第一步:

unsafe extern "C" {
    fn sensor_read(out: *mut u8, len: usize) -> i32;
}

这只告诉 Rust:有一个 C ABI 函数叫 sensor_read。

但链接器还要知道:

这个函数在哪个库里?
库文件在哪个目录?
还需要链接哪些依赖库?
交叉编译时用的是目标系统的库,还是宿主机的库?

C 项目里这些通常由 Makefile、CMake、pkg-config、sysroot 和交叉工具链处理。Rust 项目里,对应工具是 #[link]、build.rs 和 build dependency。

阅读更多

FFI:让 Rust 调用 C

4 分钟

Rust 调 C,表面上只是多写一段 extern "C" 声明。

真正需要处理的是另一件事:C 函数没有 Rust 的借用、生命周期、Result 和析构规则。Rust 可以调用它,但编译器无法证明这个调用是否满足 C API 的前提。

阅读更多