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");