Ruby-FFI は、動的にリンクされたネイティブ ライブラリをプログラムで読み込み、ライブラリ内の関数をバインドし、Ruby コードからそれらの関数を呼び出すための gem です。さらに、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 (Gentoo、Alpine など) で実行されている Linux システムでは、FFI がmprotect
エラーを引き起こす可能性があります。解決策が見つかるまで、当面は Ruby の mprotect ( paxctl -m [/path/to/ruby]
) を無効にする必要があるかもしれません。
FreeBSD システムでは、clang を使用して gem をコンパイルできるように、pkgconf をインストールする必要があります。パッケージpkg install pkgconf
を介してインストールするか、 devel/pkgconf
を介してポートからインストールします。
JRuby と TruffleRuby では、FFI gem をインストールする必要はなく、gem をインストールしなくてもrequire 'ffi'
(つまり、これらの実装には gem がプリインストールされています)。
Rubygems から:
[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 ライセンスによってカバーされています。
次の人々がコードやバグ レポートを提出し、このプロジェクトの成功に貢献しました。