7个版本
0.0.7 | 2021年8月9日 |
---|---|
0.0.6 | 2021年8月9日 |
0.0.3 | 2021年7月18日 |
#128 in FFI
2.5MB
67K SLoC
libffi-rs:libffi的Rust绑定
C库libffi提供了两个主要功能:动态调用函数的汇编,以及创建可以像普通C函数一样调用的闭包。在Rust中,后者意味着我们可以将Rust lambda(或任何实现Fn
/FnMut
的对象)转换为普通C函数指针,我们可以将其作为回调传递给C。
用法
构建libffi
将构建lifbffi-sys
,这将反过来构建来自github的libffi C库,这要求您首先有一个正常工作的make、C编译器、automake和autoconf。它在crates.io
上,因此您可以在Cargo.toml
中添加
[dependencies]
libffi = "1.0.1"
。
此包依赖于libffi-sys
包,该包默认尝试构建自己的C libffi库版本。为了使用系统中的C libffi,请在您的Cargo.toml
中启用此包的system
功能
[features]
libffi = { version = "1.0.1", features = ["system"] }
有关如何找到C libffi的更多信息,请参阅libffi-sys
文档。
此包支持Rust版本1.36及以后版本。
示例
在此示例中,我们将包含自由变量的Rust lambda转换为普通C代码指针。下面fun
的类型是extern "C" fn(u64, u64) -> u64
。
use libffi::high::Closure2;
let x = 5u64;
let f = |y: u64, z: u64| x + y + z;
let closure = Closure2::new(&f);
let fun = closure.code_ptr();
assert_eq!(18, fun(6, 7));