cxx 是目前最成熟、安全、零成本的 C++ 与 Rust 交互方案,通过 #[cxx::bridge] 宏在编译期自动生成类型安全的跨语言绑定,支持 RAII 内存管理、零运行时开销,并强制使用 UniquePtr 等安全类型替代裸指针。

用 C++ 和 Rust 交互,cxx 是目前最成熟、安全、零成本的方案。它不依赖 FFI 手写绑定,而是通过宏和代码生成,在编译期保证类型和生命周期安全,让两种语言像“同一语言”一样协作。
一、cxx 的核心机制:不是传统 FFI,而是跨语言 ABI 桥接
cxx 不是让你写 extern "C" 函数再手动管理内存——它用 #[cxx::bridge] 宏定义一个共享接口,自动生成 C++ 头文件、Rust 绑定代码和类型转换逻辑。所有跨语言调用都在编译时检查:C++ 类型 ↔ Rust 类型、所有权(如 UniquePtr / Box)、字符串(CxxString ↔ String)、向量(CxxVector ↔ Vec)全部自动适配,且无运行时开销。
- 你只写一次接口描述,cxx 同时产出 .h 和 .rs 文件
- Rust 中调用 C++ 函数?直接像调用本地函数一样,参数/返回值自动转换
- C++ 中调用 Rust 函数?包含生成的头文件,链接 rust crate 编译出的静态库即可
- 不支持裸指针、手动 new/delete 交叉传递;强制使用
UniquePtr、SharedRef等 RAII 类型
二、快速上手:三步集成一个可运行示例
假设你想从 Rust 调用 C++ 的字符串处理函数(比如 base64 编码),同时让 C++ 能调用 Rust 的日志打印。
-
第 1 步:新建 Cargo 项目并添加依赖
在Cargo.toml中加入:[dependencies]<br>cxx = "1.0"
登录后复制
[build-dependencies]<br>cxx-build = "1.0"
登录后复制
-
第 2 步:编写 bridge 模块(lib.rs)
用#[cxx::bridge]声明接口,例如:#[cxx::bridge]<br>mod ffi {<br> extern "C" {<br> type Base64Encoder;<br> fn new_encoder() -> UniquePtr<Base64Encoder>;<br> fn encode(&self, input: &CxxString) -> CxxString;<br> }<br> unsafe extern "C++" {<br> include!("example.h");<br> fn rust_log(msg: &CxxString);<br> }<br>}登录后复制
-
第 3 步:在 build.rs 中构建 C++ 源码
调用cxx_build::bridge("src/lib.rs"),并把 C++ 实现(如encoder.cpp)加入编译。C++ 端需实现Base64Encoder类和rust_log的 C++ 声明(但定义由 Rust 提供)
三、关键注意事项与避坑点
cxx 强大但有明确边界,理解这些能避免编译失败或未定义行为:
标签: python js go 编码 ai c++ 为什么 red
还木有评论哦,快来抢沙发吧~