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日

#29FFI

Download history 11038/week @ 2024-03-24 12089/week @ 2024-03-31 11255/week @ 2024-04-07 12477/week @ 2024-04-14 12144/week @ 2024-04-21 11972/week @ 2024-04-28 11306/week @ 2024-05-05 11629/week @ 2024-05-12 11487/week @ 2024-05-19 10399/week @ 2024-05-26 11014/week @ 2024-06-02 10698/week @ 2024-06-09 11068/week @ 2024-06-16 10113/week @ 2024-06-23 8240/week @ 2024-06-30 9364/week @ 2024-07-07

39,804 每月下载量
用于 45 个crates (15个直接使用)

MIT/Apache

3MB
70K SLoC

C 35K SLoC // 0.2% comments GNU Style Assembly 14K SLoC // 0.2% comments M4 9K SLoC // 0.2% comments Shell 9K SLoC // 0.2% comments Rust 2.5K SLoC // 0.0% comments Bitbake 435 SLoC // 0.1% comments Automake 257 SLoC // 0.1% comments Python 246 SLoC Perl 170 SLoC // 0.4% comments C++ 127 SLoC // 0.1% comments Visual Studio Project 125 SLoC // 0.0% comments Visual Studio Solution 32 SLoC

libffi-rs: Rust绑定libffi

GitHub Workflow Status Documentation Crates.io License: MIT License: Apache 2.0

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

依赖项