推荐使用 C ABI + 手写 extern "C" 方式:Rust 用 #[no_mangle] + extern "C" 暴露纯函数,C++ 用 extern "C" 声明并链接静态/动态库,内存管理责任明确,配合 RAII 封装句柄,避免 STL/Rust 高级类型、跨语言异常及线程安全问题。

直接在 C++ 中调用 Rust 代码,不推荐直接使用 cxx 库——因为 cxx 是一个 Rust 主导的绑定生成器,它的设计目标是让 Rust 代码安全地调用 C++,而非反过来。它生成的 C++ 接口是“只读”且高度受限的(例如不支持裸指针、不支持自定义析构、不支持多线程回调),用于 C++ 主动调用 Rust 并不可靠,也违背其设计初衷。
最成熟、稳定、跨平台、可调试的方式,仍是基于标准 C ABI 的互操作:
#[no_mangle] + extern "C" 暴露纯函数,参数/返回值仅限 C 兼容类型(i32, const char*, struct 值传递等)extern "C" 声明函数,直接链接 Rust 编译出的静态库(.a)或动态库(.so/.dll)Box/Vec 给 C++,如需传字符串或数组,用 const char* + size_t 或手动管理生命周期若 Rust 返回了需要释放的句柄(如 uintptr_t 表示的内部指针),C++ 应用 RAII 封装:
class RustBuffer {
uintptr_t handle_ = 0;
public:
explicit RustBuffer(uintptr_t h) : handle_(h) {}
~RustBuffer() { if (handle_) rust_buffer_free(handle_); }
RustBuffer(const RustBuffer&) = delete;
RustBuffer& operator=(const RustBuffer&) = delete;
// 提供 data()/size() 等只读访问接口
};这样能避免裸指针泄漏和重复释放,把不安全的 C 边界收敛到一个小类里。
立即学习“C++免费学习笔记(深入)”;
String/Vec:它们的内存布局和 ABI 不稳定int)或错误指针(nullptr)表示失败Send/Sync 不自动映射到 C++;若 Rust 函数被多线程调用,确保其内部加锁或标明 unsafe 并由 C++ 同步add_subdirectory 或 find_package 引入 Rust 构建产物,或用 cargo-c 工具生成标准 C 头文件与库仅当你的主程序是 Rust,而少量性能关键模块用 C++ 实现,并希望 Rust 安全调用它们时,cxx 才是正途。反过来强行用它让 C++ 去“调用 Rust 对象”,会导致:
cxx::UniquePtr 在 C++ 侧析构可能触发 panic)基本上就这些。C ABI 虽然原始,但清晰、可控、零运行时开销,是跨语言互操作的基石。别为了“酷”放弃稳定性。
以上就是c++++如何使用cxx库安全地调用Rust代码_c++与Rust互操作最佳实践【跨语言】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号