PerlXS:C++編
次にC++ラッパーの作り方。
参考:http://www.johnkeiser.com/perl-xs-c++.html
例えば以下の仕様のC++ライブラリがあったとする。
$$ cat echizen.h #include <string> namespace echizen { using namespace std; class bot { public: bot(string name); ~bot(); void speak(); // print "I am name." }; }
これをラップすることを考える。まずMakefile.PLに以下の行を追加する。
# OBJECT => '$(O_FILES)', # link all the C files too # ここから CC => '/usr/bin/g++', LD => '/usr/bin/g++', XSOPT => '-C++', TYPEMAPS => ['perlobject.map' ], # ここまで );
次に、perlobject.mapを入手する。例えば以下のサイトから入手可能。
http://ftp.yz.yamagata-u.ac.jp/pub/lang/CPAN/modules/by-authors/id/DMR/
次に、typemapを書く
$$ cat typemap TYPEMAP bot * O_OBJECT
最後にxsファイルを書く。ラップしたクラス名は元のC++のクラス名とは異なっていて良い。ここではperlのほうのクラスはEchizenBotとする。
#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif #ifdef vform #undef vform #endif #include "ppport.h" #include "echizen.h" using namespace echizen; MODULE = EchizenBot PACKAGE = EchizenBot bot * bot::new(name) char *name; CODE: bot *b = new bot(name); RETVAL = b; OUTPUT: RETVAL void bot::DESTROY() void bot::speak() CODE: THIS->speak();
あとはmakeすればOK。
$$ perl Makefile.PL $$ gmake
ライブラリを呼び出すコードを書く。
$$ do.pl #!/usr/local/bin/perl -Iblib/lib -Iblib/arch use strict; use warnings; use EchizenBot; my $b = EchizenBot->new("echizentm"); $b->speak(); $$ ./do.pl I am echizentm.
となる。