答案:C++通过C ABI调用Rust函数需在Rust中使用#[no_mangle]和extern "C"导出函数,编译为动态库,C++中声明对应函数并链接调用,传递基础类型或#[repr(C)]标记的结构体,避免复杂类型。

要在C++中调用Rust编写的函数,核心方法是通过C语言的ABI(应用二进制接口)进行互操作。Rust支持生成与C兼容的函数接口,而C++可以直接调用C风格的函数。整个过程包括:在Rust中编写函数并导出为C ABI,编译为静态或动态库,然后在C++项目中链接并调用。
使用#[no_mangle]和extern "C"让Rust函数暴露给外部语言。
例如,创建一个Rust库,实现一个简单的加法函数:
// src/lib.rs
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}
这里的关键点:
立即学习“C++免费学习笔记(深入)”;
修改Cargo.toml,设置crate类型为cdylib或staticlib:
[lib] name = "rust_lib" # 生成动态库(推荐用于跨语言) crate-type = ["cdylib"]
执行编译:
cargo build --release
输出文件通常位于target/release/目录下:
在C++代码中,用extern "C"声明函数原型,避免C++名称修饰问题。
// main.cpp
#include <iostream>
<p>// 声明Rust函数
extern "C" {
int32_t add(int32_t a, int32_t b);
}</p><p>int main() {
int result = add(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
编译C++代码时,链接Rust生成的库。
例如,在Linux上:
g++ main.cpp -L./target/release -lrust_lib -o test_cpp export LD_LIBRARY_PATH=./target/release:$LD_LIBRARY_PATH ./test_cpp
注意:
传递结构体或字符串需要额外注意内存布局和生命周期。
例如,Rust中定义并导出结构体:
#[repr(C)]
pub struct Point {
pub x: f64,
pub y: f64,
}
<h1>[no_mangle]</h1><p>pub extern "C" fn distance(p1: Point, p2: Point) -> f64 {
((p1.x - p2.x).powi(2) + (p1.y - p2.y).powi(2)).sqrt()
}
C++中对应声明:
extern "C" {
double distance(Point p1, Point p2);
}
<p>struct Point {
double x, y;
};
关键点:
基本上就这些。只要遵循C ABI规范,C++调用Rust并不复杂,但需小心类型匹配和内存管理。调试时可用nm或objdump检查Rust生成的符号是否正确导出。
以上就是C++怎么调用Rust编写的函数_C++与Rust互操作方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号