用 Rust 搭配一点 C

主要观点:在 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脚本触发或用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 文件
阅读 19
0 条评论