当前位置: 首页
编程语言
在Ubuntu操作系统中实现Rust编程语言与C/C++编程语言的互相调用

在Ubuntu操作系统中实现Rust编程语言与C/C++编程语言的互相调用

热心网友 时间:2026-06-25
转载

在Ubuntu上,通过FFI实现Rust与C C++互调:用cargo创建Rust动态库项目,函数标注 [no_mangle]和extern "C "后编译为 so文件;C C++程序用extern声明函数原型,链接时指定 so文件即可调用。

在Ubuntu系统上实现Rust与C/C++的互操作(FFI),实际上就是让不同语言编写的代码能够共享函数并相互调用。本文将从零开始,手把手带您搭建完整的Rust与C/C++交互流程,确保每一步都能顺利执行。

Rust在Ubuntu上如何与C/C++交互

1. 安装Rust环境

首先需要确保系统中已正确安装Rust。如果尚未安装,只需执行以下命令即可完成:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

完成后建议通过 rustc --version 验证版本信息,确认安装无误。

2. 创建Rust库项目

本次将创建库项目而非可执行程序,因此使用 cargo new --lib 来初始化:

cargo new --lib my_rust_lib
cd my_rust_lib

3. 配置Cargo.toml

关键步骤:告知Cargo需要生成动态链接库(Linux环境下为 .so 文件)。编辑 Cargo.toml,在文件末尾添加以下配置:

[lib]
name = "my_rust_lib"
crate-type = ["cdylib"]

其中 cdylib 表示“C动态库”,编译后将生成 libmy_rust_lib.so

4. 编写Rust函数

打开 src/lib.rs,编写一个可被C调用的函数。核心是使用 #[no_mangle]extern "C" 属性,确保函数名不被混淆并遵循C的ABI:

#[no_mangle]
pub extern "C" fn rust_function() {
    println!("Hello from Rust!");
}

实际项目中,此函数可承载任意复杂逻辑。

5. 编译Rust代码

执行编译命令:

cargo build --release

编译完成后,在 target/release 目录下即可找到 libmy_rust_lib.so 动态库文件。

6. 创建C/C++调用项目

接下来需要编写C或C++程序来调用上述Rust函数。两种语言的处理方式有所不同,分别说明。

C语言示例

创建 main.c 文件:

#include 

// 声明Rust函数
void rust_function();

int main() {
    printf("Calling Rust function...\n");
    rust_function();
    return 0;
}

编译时需指定链接路径和库名:

gcc -o my_c_program main.c -L/path/to/rust/library -lmy_rust_lib -lpthread -ldl

请将 /path/to/rust/library 替换为实际的 target/release 目录路径,例如 ./target/release

C++语言示例

创建 main.cpp 文件:

#include 

// 声明Rust函数
extern "C" void rust_function();

int main() {
    std::cout << "Calling Rust function..." << std::endl;
    rust_function();
    return 0;
}

编译命令:

g++ -o my_cpp_program main.cpp -L/path/to/rust/library -lmy_rust_lib -lpthread -ldl

7. 运行程序验证

执行编译后的可执行文件:

./my_c_program
# 或
./my_cpp_program

若一切正常,输出结果应包含以下两行:

Calling Rust function...
Hello from Rust!

注意事项与最佳实践

  • Rust与C/C++的编译器必须采用一致的ABI(应用程序二进制接口)。在Linux x86_64平台上,默认均使用System V ABI,通常不会出现冲突。
  • extern "C" 是双方通信的桥梁,它指示Rust编译器按照C语言的约定暴露函数,使得C/C++能够正确识别并调用。
  • 内存管理与所有权需格外谨慎。Rust的所有权模型与C的malloc/free机制不能混用。传递复杂数据结构时,建议仅传递指针,或使用 CStringBox 等安全封装进行交互。

通过以上七个步骤,您可以在Ubuntu上轻松实现Rust与C/C++的跨语言调用。实际生产环境可能涉及回调函数、结构体传递、错误处理等进阶场景,但底层框架与此一致。

来源:https://www.yisu.com/ask/99323980.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
IDEA中SpringBoot项目热部署实现指南

IDEA中SpringBoot项目热部署实现指南

Springboot项目在IDEA中实现热部署需依次完成:开启自动编译(静态与动态编译)、启用热部署策略、引入spring-boot-devtools依赖、关闭浏览器缓存,最后启动测试即可生效,省去手动重启时间,大幅提升开发效率。

时间:2026-07-11 06:47
Java实现Excel转JSON的代码详解

Java实现Excel转JSON的代码详解

使用Java结合FreeSpire XLS库可自动将Excel转为JSON,通过读取工作表并映射为键值对,高效支持数据迁移、报表导出与系统对接,大幅提升效率并消除手动录入错误。

时间:2026-07-11 06:47
Golang高效布谷鸟过滤器多字符集字符串过滤

Golang高效布谷鸟过滤器多字符集字符串过滤

布谷鸟过滤器支持删除操作,通过指纹截断与双哈希定位实现多字符集高效过滤。指纹截断需采用fnv64a或xxhash快速哈希并取低8位,桶索引使用独立双哈希避免假阳性。并发安全需以固定数组配合sync atomic实现。

时间:2026-07-11 06:47
Java使用Poi-tl按Word模板生成动态表格

Java使用Poi-tl按Word模板生成动态表格

Poi-tl是Word导出工具,文档周全,支持多级合并表头生成。通过{{text}}、{{?var}}、{{ table}}标签处理模板,传入TableRenderData对象即可动态渲染表格。示例展示用户信息表格生成,并提供工具类消除表格首行缩进,确保格式正确。

时间:2026-07-11 06:47
Go语言微服务集成Swagger生成交互式API文档完整教程

Go语言微服务集成Swagger生成交互式API文档完整教程

在Go微服务中集成Swagger常见四大问题:swaginit初始化失败需确保存在packagemain及注释;SwaggerUI加载失败因路由映射错误或未导入docs;@Param注解必须严格遵循格式;部署后接口文档显示localhost因硬编码host,应删除或通过环境变量动态注入。

时间:2026-07-11 06:47
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜