首页 > 后端开发 > C++ > 正文

c++如何与Rust交互 c++ cxx库使用教程【指南】

穿越時空
发布: 2025-12-24 06:01:27
原创
738人浏览过
cxx 是目前最成熟、安全、零成本的 C++ 与 Rust 交互方案,通过 #[cxx::bridge] 宏在编译期自动生成类型安全的跨语言绑定,支持 RAII 内存管理、零运行时开销,并强制使用 UniquePtr 等安全类型替代裸指针。

c++如何与rust交互 c++ cxx库使用教程【指南】

用 C++ 和 Rust 交互,cxx 是目前最成熟、安全、零成本的方案。它不依赖 FFI 手写绑定,而是通过宏和代码生成,在编译期保证类型和生命周期安全,让两种语言像“同一语言”一样协作。

一、cxx 的核心机制:不是传统 FFI,而是跨语言 ABI 桥接

cxx 不是让你写 extern "C" 函数再手动管理内存——它用 #[cxx::bridge] 宏定义一个共享接口,自动生成 C++ 头文件、Rust 绑定代码和类型转换逻辑。所有跨语言调用都在编译时检查:C++ 类型 ↔ Rust 类型、所有权(如 UniquePtr / Box)、字符串(CxxStringString)、向量(CxxVectorVec)全部自动适配,且无运行时开销。

  • 你只写一次接口描述,cxx 同时产出 .h 和 .rs 文件
  • Rust 中调用 C++ 函数?直接像调用本地函数一样,参数/返回值自动转换
  • C++ 中调用 Rust 函数?包含生成的头文件,链接 rust crate 编译出的静态库即可
  • 不支持裸指针、手动 new/delete 交叉传递;强制使用 UniquePtrSharedRef 等 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 强大但有明确边界,理解这些能避免编译失败或未定义行为:

Bertha.ai
Bertha.ai

一款专为WordPress打造的AI内容和图像创建工具

Bertha.ai 120
查看详情 Bertha.ai

立即学习C++免费学习笔记(深入)”;

  • 类型必须显式声明:C++ 的 std::string 不能直接当参数,要用 CxxStringstd::vector<int></int> 对应 CxxVector<i32></i32>
  • 构造函数/析构函数需显式暴露:C++ 类若要被 Rust 拥有,必须在 extern "C" 块中声明 new_XXX()drop_XXX()(或使用 UniquePtr 自动管理)
  • 不支持模板、重载、异常穿越:C++ 函数名必须唯一,不能有多个同名函数;Rust 端 panic 不会传播到 C++,反之亦然
  • 线程安全靠你自己:cxx 不加锁,如果 C++ 对象被多线程访问,需自行加 std::mutex 或用 Sync trait 标记 Rust 类型

四、替代方案对比(为什么推荐 cxx 而非其他)

对比常见方式:

  • 纯 C FFI:灵活但易出错,需手写类型转换、内存管理、错误码映射,无法表达复杂结构(如继承、RAII)
  • autocxx:基于 cxx,可自动绑定现有 C++ 库,适合接入大型 C++ 项目,但学习曲线略高、生成代码体积大
  • bindgen + 手写封装:适合 C 风格库,对 C++ 支持弱(尤其模板、类成员函数)
  • PyO3 / neon:仅限 Python/JS 生态,不解决 C++/Rust 直接互操作

cxx 在安全性、开发体验和性能之间取得了最佳平衡——它不试图“隐藏”语言差异,而是用编译器帮你守住底线。

以上就是c++++如何与Rust交互 c++ cxx库使用教程【指南】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号