主要观点:在 Rust 项目中使用 C 或 C++包含两部分,需包装暴露的 C API 并构建与 Rust 代码集成的 C 或 C++代码,推荐使用CABI 结合;要先在 Rust 中定义与链接代码中相同的数据类型和函数签名,可手动翻译或用bindgen自动生成;还需提前编译非 Rust 代码,对于嵌入式项目可编译为静态存档,用build.rs脚本触发外部构建系统或使用cc crate 直接编译 C/C++代码。
关键信息:
- 包含两部分:包装 C API、构建 C/C++代码
- 结合建议:用
CABI - 定义接口:手动翻译或用
bindgen自动生成 - 手动翻译:用
#[repr(C)]保证与 C 兼容,用cty定义数据类型,定义函数签名并注意指针等 bindgen使用:收集头文件、写bindings.h、用bindgen生成代码并处理输出- 构建 C/C++代码:提前编译,嵌入式项目编译为静态存档,用
build.rs脚本触发或用cccrate build.rs脚本:在编译机器上执行,用于生成代码等,可触发外部系统或使用cccrate- 触发外部系统:用
std::process::Command - 使用
cccrate:简单编译 C 文件为静态存档
重要细节:
extern "C"用于定义 C ABI 函数签名*mut CoolStruct是 C 中的原始指针,需注意安全性build.rs脚本在依赖项构建后、项目构建前执行cc::Build::new()用于配置cccrate 编译 C 文件
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。