40个版本 (8个稳定版)
3.2.0 | 2023年3月28日 |
---|---|
3.0.1 | 2022年9月2日 |
3.0.0 | 2022年3月7日 |
2.0.1 | 2022年2月13日 |
0.4.0 | 2016年6月21日 |
#29 在 FFI 中
39,804 每月下载量
用于 45 个crates (15个直接使用)
3MB
70K SLoC
libffi-rs: Rust绑定libffi
C库libffi提供了两个主要功能:动态调用函数的汇编和创建可以作为普通C函数调用的闭包。在Rust中,后者意味着我们可以将Rust lambda(或任何实现Fn
/FnMut
的对象)转换为普通C函数指针,我们可以将其作为回调传递给C。
使用方法
构建libffi
将构建lifbffi-sys
,它将反过来从github构建libffi C库,这要求您首先有一个工作状态的make、C编译器、automake和autoconf。它在crates.io上,因此您可以将
[dependencies]
libffi = "3.2.0"
添加到您的Cargo.toml
。
此crate依赖于libffi-sys
crate,默认情况下它尝试构建自己的C libffi库版本。为了使用您的系统C libffi,请在您的Cargo.toml
中启用此crate的system
功能
[features]
libffi = { version = "3.2.0", features = ["system"] }
有关如何查找C libffi的更多信息,请参阅libffi-sys
文档
此crate支持Rust版本1.48及以后版本
示例
在这个例子中,我们将包含自由变量的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));