C言語のライブラリをXSファイルから読み込む方法
C言語のライブラリをXSファイルから読み込む方法を解説します。
h2xsでモジュールを作成
最初にh2xsでXS用のモジュールを作成します。
h2xs -A -n SomeModule
こうすると「SomeModule」というディレクトリが作成されます。次のようなファイルとディレクトリが作成されます。
Changes lib/ Makefile.PL MANIFEST ppport.h README SomeModule.xs t/
C言語のライブラリの作成
まずC言語のライブラリを作成しましょう。ヘッダファイルとソースファイルを作成します。
mylib.h
ヘッダファイルです。mylib_printを宣言しています。
void mylib_print();
mylib.c
ソースファイルです。mylib_printは「mylib」という文字列を出力する関数です。
#include <stdio.h> void mylib_print() { printf("mylib\n"); }
ヘッダファイルとソースファイルは保存して、XSファイルが存在するディレクトリと同じディレクトリに配置してください。同じディレクトリにおいておくのが、後の設定が少なくて観点です。
XSファイルの記述
XSファイルを記述しましょう。mylib_printを呼び出しています。
#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "mylib.h" MODULE = SomeModule PACKAGE = SomeModule void foo(...) PPCODE: { mylib_print(); XSRETURN(0); }
Makefile.PLの修正
次にMakefile.PLを少し修正しましょう。一番下の「OBJECT」オプションがデフォルトではコメントアウトされているので、コメントを取り除きます。「$(O_FILES)」という設定をすれば、カレントディレクトリのすべてのC言語ソースファイルがコンパイルの対象になります。
use ExtUtils::MakeMaker; WriteMakefile( NAME => 'SomeModule', VERSION_FROM => 'lib/SomeModule.pm', # finds $VERSION PREREQ_PM => {}, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/SomeModule.pm', # retrieve abstract from module AUTHOR => 'A. U. Thor <kimoto@sakura.ne.jp>') : ()), LIBS => [''], # e.g., '-lm' DEFINE => '', # e.g., '-DHAVE_SOMETHING' INC => '-I.', # e.g., '-I. -I/usr/include/other' OBJECT => '$(O_FILES)', # link all the C files too );
テストスクリプト
テストスクリプトを作成します。これは、XSファイルがあるディレクトリと同じディレクトリにおいてください。
use strict; use warnings; use SomeModule; SomeModule::foo();
コンパイルして実行
コンパイルして実行してみましょう。
perl Makefile.PL make perl -Mblib test.pl
次のように出力されれば成功です。
mylib
これで、C言語のライブラリをXSファイルから読み込むことができるようになりました。