Rust 语言对 FFI 有比较完善的支持。本节主要讲在基础设施层面,Rust 语言对 FFI 的支持。
Rust 语言主要在关键字和标准库两个方面对 FFI 提供了支持,具体如下:
关键字
extern
-
属性
#[no_mangle]
外部块
ExternBlock
及其属性link
和link_name
标准库
-
std:os:raw
模块std:ffi
模块
1. 关键字 extern
在 Rust 语言中,使用关键字extern
可以实现 Rust 语言与其它语言的交互,这是 Rust 外部函数接口 FFI 的基础。
1.1 extern
函数
直接在 Rust 的函数关键字fn
前使用关键字extern
,可以创建一个允许其他语言调用 Rust 函数的接口。
同时可以通过使用 ABI 字符串[1]来指定具体的 ABI,其中有三个 ABI 字符串是跨平台的:
extern "Rust"
,默认的 ABI,在 Rust 代码中对任何普通函数fn foo()
声明时都将使用该 ABI。extern "C"
,指定使用 C-ABI,类似extern fn foo()
,无论 C 编译器支持哪种默认设置。extern "system"
,通常类似extern "C"
,但在 Win32 平台上,它是"stdcall",或用于链接到 Windows API。
// ffi/c-call-rust/src/lib.rs
pub extern "C" fn call_from_rust() {
println!("This is a Rust function for C!");
}
1.2 属性 #[no_mangle]
属性no_mangle