1. Perl
  2. モジュール
  3. here

FFI::Raw - C言語の関数をPerlから直接呼び出す

PerlにはC言語を呼び出すための方法として基本的なものでかつ、汎用的に利用できるものとしてXS言語というものが用意されています。

でもXS言語を書くのは一苦労です。C言語で書かれたライブラリをPerlから簡単に呼び出すことができると便利ですね。

libffiというC言語のライブラリを他の言語から呼び出す仕組みがあるのですが、これのPerl実装のひとつがFFI::Rawです。CPANから簡単にインストールできます。

以下のサンプルは、サイトに書かれていたものそのままですが、mというライブラリのcosという関数を呼び出しているサンプルです。

use FFI::Raw;

my $cos = FFI::Raw->new(
  'libm.so', 'cos',
  FFI::Raw::double, # 戻り値
  FFI::Raw::double  # 引数1
);

print $cos->call(2.0);

第一引数はダイナミックライブラリ名です。C言語ではmというダイナミックライブラリに対応するファイル名はlibm.soになります。

ドキュメントにライブラリの検索パスの記述はないですが、/lib/usr/libにおかれているものが検索対象だと思われます。

ライブラリの検索パスを追加するには、「環境変数 LD_LIBRARY_PATHを設定する方法」と「/etc/ld.so.confに追加する方法」があるようです。

第二引数は関数名です。第三引数は戻り値の型、第四引数以降は、引数の型になります。

他のPerlのFFIモジュール

他のPerlのFFIモジュールの紹介です。

FFI::Platypus

FFIのPerlのモジュールとしてFFI::Platypusがあります。FFI::Platypusは、FFIの機能が豊富で、メンテナンスも継続的にされているようです。

use FFI::Platypus 1.00;
 
# for all new code you should use api => 1
my $ffi = FFI::Platypus->new( api => 1 );
$ffi->lib(undef); # search libc
 
# call dynamically
$ffi->function( puts => ['string'] => 'int' )->call("hello world");
 
# attach as a xsub and call (much faster)
$ffi->attach( puts => ['string'] => 'int' );
puts("hello world");

関連情報