Ruby-FFI — это жемчужина для программной загрузки динамически подключаемых собственных библиотек, связывания функций внутри них и вызова этих функций из кода 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) вам понадобится:
gcc
или clang
во всем остальном) Необязательно (ускоряет установку):libffi
и заголовки разработки — обычно это пакеты libffi-dev
или libffi-devel
.Гем ffi поставляется со встроенной версией 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
.
В системах Linux, работающих с PaX (Gentoo, Alpine и т. д.), FFI может вызывать ошибки mprotect
. Возможно, вам придется отключить mprotect для Ruby ( paxctl -m [/path/to/ruby]
) на время, пока не будет найдено решение.
В системах FreeBSD необходимо установить pkgconf, чтобы гем мог скомпилироваться с использованием clang. Установите либо через пакеты pkg install pkgconf
, либо из портов через devel/pkgconf
.
В JRuby и TruffleRuby не требуется установка драгоценного камня FFI, а require 'ffi'
работает даже без установки драгоценного камня (т. е. в этих реализациях драгоценный камень предустановлен).
Из рубигемов:
[sudo] gem install ffi
Из Gemfile с помощью git или GitHub
gem 'ffi', github: 'ffi/ffi', submodules: true
или из репозитория git на github:
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.
Следующие люди предоставили код, отчеты об ошибках или иным образом способствовали успеху этого проекта: