Ruby-FFI 是一个 gem,用于以编程方式加载动态链接的本机库、在其中绑定函数以及从 Ruby 代码调用这些函数。此外,Ruby-FFI 扩展无需更改即可在 CRuby (MRI)、JRuby、Rubinius 和 TruffleRuby 上运行。了解为什么应该使用 Ruby-FFI 编写下一个扩展。
require 'ffi'
module MyLib
extend FFI :: Library
ffi_lib 'c'
attach_function :puts , [ :string ] , :int
end
MyLib . puts 'Hello, World using libc!'
对于不太简约和更多的示例,您可以查看:
samples/
文件夹在 CRuby (MRI) 上安装 gem 时,您将需要:
gcc
或clang
) 可选(加快安装速度):libffi
库和开发头文件 - 这通常位于libffi-dev
或libffi-devel
包中ffi gem 附带一个内置的 libffi 版本,当系统 libffi 库不可用或太旧时,可以使用该版本。可以通过以下方式强制使用系统 libffi:
gem install ffi -- --enable-system-libffi # to install the gem manually
bundle config build.ffi --enable-system-libffi # for bundle install
或通过--disable-system-libffi
阻止。
在运行 PaX 的 Linux 系统(Gentoo、Alpine 等)上,FFI 可能会触发mprotect
错误。您可能需要暂时禁用 ruby 的 mprotect ( paxctl -m [/path/to/ruby]
),直到找到解决方案。
在 FreeBSD 系统上,必须安装 pkgconf 才能使 gem 能够使用 clang 进行编译。通过软件包pkg install pkgconf
或通过devel/pkgconf
从 ports 安装。
在 JRuby 和 TruffleRuby 上,不需要安装 FFI gem,并且即使不安装 gem, require 'ffi'
也可以工作(即,gem 已预安装在这些实现上)。
来自红宝石:
[sudo] gem install ffi
使用 git 或 GitHub 从 Gemfile 中
gem 'ffi', github: 'ffi/ffi', submodules: true
或者来自 github 上的 git 存储库:
git clone git://github.com/ffi/ffi.git
cd ffi
git submodule update --init --recursive
bundle install
rake install
--enable-system-libffi
: 强制使用系统 libffi--disable-system-libffi
: 强制使用内置 libffi--enable-libffi-alloc
: 通过 libffi 强制关闭分配--disable-libffi-alloc
:通过内置方法强制闭包分配ffi 库包含在 BSD 许可证中,另请参阅 LICENSE 文件。这些规范与 ruby/spec 具有相同的许可证,即 MIT 许可证。
以下人员已提交代码、错误报告或以其他方式对该项目的成功做出了贡献: