cxx 是目前最成熟、安全、零成本的 C++ 与 Rust 交互方案,通过 #[cxx::bridge] 宏在编译期自动生成类型安全的跨语言绑定,支持 RAII 内存管理、零运行时开销,并强制使用 UniquePtr 等安全类型替代裸指针。
用 C++ 和 Rust 交互,cxx 是目前最成熟、安全、零成本的方案。它不依赖 FFI 手写绑定,而是通过宏和代码生成,在编译期保证类型和生命周期安全,让两种语言像“同一语言”一样协作。
cxx 不是让你写 extern "C" 函数再手动管理内存——它用 #[cxx::bridge] 宏定义一个共享接口,自动生成 C++ 头文件、Rust 绑定代码和类型转换逻辑。所有跨语言调用都在编译时检查:C++ 类型 ↔ Rust 类型、所有权(如 UniquePtr / Box)、字符串(CxxString ↔ String)、向量(CxxVector ↔ Vec)全部自动适配,且无运行时开销。
UniquePtr、SharedRef 等 RAII 类型假设你想从 Rust 调用 C++ 的字符串处理函数(比如 base64 编码),同时让 C++ 能调用 Rust 的日志打印。
Cargo.toml 中加入:[dependencies]
cxx = "1.0"
[build-dependencies]
cxx-build = "1.0"
#[cxx::bridge] 声明接口,例如:#[cxx::bridge]
mod ffi {
extern "C" {
type Base64Encoder;
fn new_encoder() -> UniquePtr;
fn encode(&self, input: &CxxString) -> CxxString;
}
unsafe extern "C++" {
include!("example.h");
fn rust_log(msg: &CxxString);
}
}
cxx_build::bridge("src/lib.rs"),并把 C++ 实现(如 encoder.cpp)加入编译。C++ 端需实现 Base64Encoder 类和 rust_log 的 C++ 声明(但定义由 Rust 提供)cxx 强大但有明确边界,理解这些能避免编译失败或未定义行为:
std::string 不能直接当参数,要用 CxxString;std::vector 对应 CxxVector
extern "C" 块中声明 new_XXX() 和 drop_XXX()(或使用 UniquePtr 自动管理)std::mutex 或用 Sync trait 标记 Rust 类型对比常见方式:
cxx 在安全性、开发体验和性能之间取得了最佳平衡——它不试图“隐藏”语言差异,而是用编译器帮你守住底线。