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 許可證。
以下人員已提交程式碼、錯誤報告或以其他方式對該專案的成功做出了貢獻: