Ruby-FFI é uma jóia para carregar programaticamente bibliotecas nativas vinculadas dinamicamente, vincular funções dentro delas e chamar essas funções a partir do código Ruby. Além disso, uma extensão Ruby-FFI funciona sem alterações em CRuby (MRI), JRuby, Rubinius e TruffleRuby. Descubra por que você deve escrever sua próxima extensão usando Ruby-FFI.
require 'ffi'
module MyLib
extend FFI :: Library
ffi_lib 'c'
attach_function :puts , [ :string ] , :int
end
MyLib . puts 'Hello, World using libc!'
Para exemplos menos minimalistas e mais exemplos, você pode consultar:
samples/
pastaAo instalar a gema no CRuby (MRI), você precisará de:
gcc
ou clang
em todo o resto) Opcionalmente (acelera a instalação):libffi
e os cabeçalhos de desenvolvimento - geralmente nos pacotes libffi-dev
ou libffi-devel
A gem ffi vem com uma versão libffi integrada, que é usada quando a biblioteca libffi do sistema não está disponível ou é muito antiga. O uso do sistema libffi pode ser imposto por:
gem install ffi -- --enable-system-libffi # to install the gem manually
bundle config build.ffi --enable-system-libffi # for bundle install
ou impedido por --disable-system-libffi
.
Em sistemas Linux rodando com PaX (Gentoo, Alpine, etc.), o FFI pode desencadear erros mprotect
. Pode ser necessário desabilitar o mprotect para Ruby ( paxctl -m [/path/to/ruby]
) por enquanto até que uma solução seja encontrada.
Em sistemas FreeBSD, o pkgconf deve ser instalado para que a gem possa ser compilada usando clang. Instale através de pacotes pkg install pkgconf
ou de ports via devel/pkgconf
.
No JRuby e TruffleRuby, não há requisitos para instalar a gema FFI, e require 'ffi'
funciona mesmo sem instalar a gema (ou seja, a gema está pré-instalada nessas implementações).
De gemas de rubi:
[sudo] gem install ffi
De um Gemfile usando git ou GitHub
gem 'ffi', github: 'ffi/ffi', submodules: true
ou do repositório git no github:
git clone git://github.com/ffi/ffi.git
cd ffi
git submodule update --init --recursive
bundle install
rake install
--enable-system-libffi
: Força o uso da libffi do sistema--disable-system-libffi
: Força o uso da libffi integrada--enable-libffi-alloc
: Força a alocação de fechamento pela libffi--disable-libffi-alloc
: Força a alocação de fechamento pelo método integrado A biblioteca ffi é coberta pela licença BSD, veja também o arquivo LICENSE. As especificações são cobertas pela mesma licença que ruby/spec, a licença MIT.
As seguintes pessoas enviaram códigos, relatórios de bugs ou contribuíram de outra forma para o sucesso deste projeto: