使用CXX Bridge实现C++调用Rust且以C++为程序入口的问题咨询
解决方案
1. 调整Rust项目的构建类型
你遇到的CXX要求main函数的报错本质是默认创建的Rust项目是二进制可执行类型,Cargo要求二进制项目必须存在main入口,你需要把Rust项目改为库类型,即可移除Rust侧的main函数:
- 打开Rust项目的
Cargo.toml,删除原有和二进制入口相关的配置,新增[lib]配置段:
[package] name = "rust_lib" version = "0.1.0" edition = "2021" [dependencies] cxx = "1.0" [lib] # 根据你的链接需求选择静态库或动态库,静态库更适合嵌入C++宿主 crate-type = ["staticlib"]
- 将原
src/main.rs重命名为src/lib.rs,删除原有Rust侧的main函数即可,Cargo不再要求库项目存在main入口。
2. 配置CXX桥接导出Rust函数
在src/lib.rs中按CXX规范定义桥接,导出需要被C++调用的Rust函数:
#[cxx::bridge] mod ffi { unsafe extern "Rust" { // 你要暴露给C++调用的Rust测试函数 fn rust_test_func(param: i32) -> i32; } } fn rust_test_func(param: i32) -> i32 { param + 1 }
执行cargo build后,会在target/debug/(或release对应目录)下生成librust_lib.a(静态库文件名和你的package name对应)。
3. C++侧配置与调用
3.1 生成C++头文件
你可以使用cxx-build工具自动生成桥接头文件,生成的头文件会包含rust_test_func的C++声明,直接包含即可。
3.2 编写C++入口代码
#include <iostream> // 包含CXX生成的桥接头文件 #include "rust_lib/src/lib.rs.h" int main() { std::cout << "调用Rust函数结果:" << rust_test_func(10) << std::endl; return 0; }
3.3 编译链接C++项目
编译C++代码时,链接之前生成的Rust静态库即可,以gcc为例:
g++ main.cpp -o my_app -I./ -L./rust_lib/target/debug -lrust_lib -lpthread -ldl
注:Rust静态库链接时需要附加pthread、dl等系统依赖,根据你的操作系统环境调整即可。
可选:统一构建流程
如果不想分开构建Rust库和C++项目,可以使用Corrosion(CMake工具)或者cxx-build直接在CMake中集成Rust库的构建,自动处理头文件生成和链接逻辑,不需要手动执行cargo build。
内容的提问来源于stack exchange,提问作者Sakuragaoka
相关产品推荐
相关产品推荐

