Ruby-FFI es una joya para cargar mediante programación bibliotecas nativas vinculadas dinámicamente, vincular funciones dentro de ellas y llamar esas funciones desde el código Ruby. Además, una extensión Ruby-FFI funciona sin cambios en CRuby (MRI), JRuby, Rubinius y TruffleRuby. Descubra por qué debería escribir su próxima extensión utilizando 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 ejemplos menos minimalistas y más, puede consultar:
samples/
carpetaAl instalar la gema en CRuby (MRI), necesitará:
gcc
o clang
en todo lo demás) Opcionalmente (acelera la instalación):libffi
y los encabezados de desarrollo: comúnmente se encuentran en los paquetes libffi-dev
o libffi-devel
.La gema ffi viene con una versión libffi incorporada, que se utiliza cuando la biblioteca libffi del sistema no está disponible o es demasiado antigua. El uso del sistema libffi se puede imponer mediante:
gem install ffi -- --enable-system-libffi # to install the gem manually
bundle config build.ffi --enable-system-libffi # for bundle install
o prevenido por --disable-system-libffi
.
En sistemas Linux que se ejecutan con PaX (Gentoo, Alpine, etc.), FFI puede provocar errores mprotect
. Es posible que deba desactivar mprotect para Ruby ( paxctl -m [/path/to/ruby]
) por el momento hasta que se encuentre una solución.
En sistemas FreeBSD, se debe instalar pkgconf para que la gema pueda compilarse usando clang. Instale a través de paquetes pkg install pkgconf
o desde puertos a través de devel/pkgconf
.
En JRuby y TruffleRuby, no hay requisitos para instalar la gema FFI y require 'ffi'
funcione incluso sin instalar la gema (es decir, la gema está preinstalada en estas implementaciones).
De rubígemas:
[sudo] gem install ffi
Desde un Gemfile usando git o GitHub
gem 'ffi', github: 'ffi/ffi', submodules: true
o desde el repositorio de git en github:
git clone git://github.com/ffi/ffi.git
cd ffi
git submodule update --init --recursive
bundle install
rake install
--enable-system-libffi
: Fuerza el uso de la libffi del sistema--disable-system-libffi
: fuerza el uso de libffi incorporado--enable-libffi-alloc
: Forzar la asignación de cierre por parte de libffi--disable-libffi-alloc
: fuerza la asignación de cierre mediante el método incorporado La biblioteca ffi está cubierta por la licencia BSD, consulte también el archivo LICENCIA. Las especificaciones están cubiertas por la misma licencia que Ruby/spec, la licencia MIT.
Las siguientes personas enviaron código, informes de errores o contribuyeron de otro modo al éxito de este proyecto: