You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:15:03