0

0

c++怎么通过FFI与Rust代码交互_C++与Rust跨语言交互与FFI接口实现

尼克

尼克

发布时间:2025-10-29 09:45:01

|

693人浏览过

|

来源于php中文网

原创

答案:通过Rust导出C兼容接口并由C++调用实现互操作。1. Rust使用extern "C"和#[no_mangle]导出函数,构建为cdylib或staticlib;2. C++声明对应函数原型并链接库文件;3. 基本类型直接传递,结构体需#[repr(C)]保证布局一致;4. 字符串通过const char*传递,Rust返回CString指针并提供释放函数,避免内存泄漏。整个过程需注意ABI兼容与手动内存管理。

c++怎么通过ffi与rust代码交互_c++与rust跨语言交互与ffi接口实现

要在C++中通过FFI(Foreign Function Interface)与Rust代码交互,核心思路是让Rust编译成C风格的静态或动态库,暴露C兼容的函数接口,然后由C++代码调用这些接口。整个过程需要处理语言间的ABI兼容、数据类型映射以及内存管理问题。

1. Rust端导出C兼容函数

Rust默认使用自己的调用约定和名称修饰,要与C++交互,必须将函数标记为extern "C",并禁用符号混淆。同时使用#[no_mangle]确保函数名在编译后保持可预测。

示例:Rust导出加法函数

// lib.rs
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

接着修改Cargo.toml,指定构建为动态库或静态库:

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

[lib]
name = "rust_lib"
crate-type = ["cdylib"]  # 或 ["staticlib"]

2. C++调用Rust函数

在C++中声明对应的函数原型,链接Rust生成的库即可调用。

示例:C++调用add函数

// main.cpp
#include 

// 声明Rust函数 extern "C" int32_t add(int32_t a, int32_t b);

int main() { int result = add(5, 7); std::cout << "Result: " << result << std::endl; return 0; }

编译时需链接Rust生成的库:

g++ main.cpp -L./target/debug -lrust_lib -o main

注意:运行前确保动态库路径可用(如将.so.dylib放在正确位置,或设置LD_LIBRARY_PATH)。

3. 复杂数据类型的传递

基本类型(如i32f64)可直接传递。结构体需保证两边定义一致,并用#[repr(C)]确保内存布局兼容。

虎课网
虎课网

虎课网是超过1800万用户信赖的自学平台,拥有海量设计、绘画、摄影、办公软件、职业技能等优质的高清教程视频,用户可以根据行业和兴趣爱好,自主选择学习内容,每天免费学习一个...

下载

示例:传递结构体

Rust:

#[repr(C)]
pub struct Point {
    pub x: f64,
    pub y: f64,
}

[no_mangle]

pub extern "C" fn distance_from_origin(p: Point) -> f64 { (p.x p.x + p.y p.y).sqrt() }

C++:

struct Point {
    double x;
    double y;
};

extern "C" double distance_from_origin(Point p);

// 调用 Point p{3.0, 4.0}; std::cout << distance_from_origin(p) << std::endl;

4. 字符串与内存管理

字符串传递较复杂,因Rust的String和C++的std::string不兼容。通常使用C风格字符串(const char*)传递,但需注意生命周期。

Rust返回字符串:不能直接返回&strString,应由调用方分配内存,或使用Box并手动释放。

use std::ffi::CString;
use std::os::raw::c_char;

[no_mangle]

pub extern "C" fn get_greeting() -> *mut c_char { CString::new("Hello from Rust!") .unwrap() .into_raw() }

// 释放函数

[no_mangle]

pub extern "C" fn free_c_string(s: *mut c_char) { if s.isnull() { return; } unsafe { let = CString::from_raw(s); } }

C++接收:

extern "C" char* get_greeting();
extern "C" void free_c_string(char*);

char* greeting = get_greeting(); std::cout << greeting << std::endl; free_c_string(greeting); // 记得释放

基本上就这些。只要遵循C ABI,合理设计接口,C++和Rust的互操作并不复杂,但要小心内存泄漏和类型不匹配问题。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

10

2025.12.22

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

303

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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