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));