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