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.

となる。