[Perl] はじめてのSWIG(PerlからC++のコードを呼び出してみよう)

http://swig.shibu.jp/によると

SWIGはさまざまな高レベルプログラミング言語C/C++で書かれたプログラムをつなぐ開発ツールです。SWIGは主に、Perl, Python, Tcl/Tk, Ruby, Guile, MzSchemeなどの一般的なスクリプト言語から使われますが、JavaやEiffelのような非スクリプト言語もサポート言語に含まれています。 SWIGは一般的には、高級インタプリタプログラミング環境を作り、ユーザインタフェースを作成するという使われかたをします。SWIGは使用も頒布も、商用・非商用向けの改変もすべてフリーです。


では早速、PerlからC++のコードを呼ぶのをやってみます。
swigは事前にインストールされていると仮定します。


用意するファイルは3つ

  • test/Hige.h
  • test/Hige.cpp
  • test/Hige.i

Hige.h

コンストラクタ・デストラクタと、toStringメソッドを用意します。

class Hige {
public:
    Hige();
    ~Hige();

public:
    const char* toString() const;
};

Hige.cpp

#include "Hige.h"

Hige::Hige() {
}

Hige::~Hige() {
}

const char* Hige::toString() const {
    return "Hige";
}

Hige.i

swig用のインターフェースファイル
HatenaSwigというパッケージ名で作ります。

%module HatenaSwig
%{
#include "Hige.h"
%}
%include Hige.h

いざコンパイル

swig -c++ -perl -shadow -o Hige_wrap.cpp Hige.i # (1)swigでHige_wrap.cppを作る
g++ -fPIC -c Hige.cpp Hige_wrap.cpp -I/usr/lib/perl5/5.8.5/i386-linux-thread-multi/CORE/ # (2)コンパイル
gcc -g -shared -Wl -o HatenaSwig.so Hige.o Hige_wrap.o -lstdc++ # (3).so作成


はまった部分は以下2点
(2)において -I オプションで指定してあげないと XSUB.h などのファイルがなくてコンパイルエラーになる。
自分の環境で locate XSUB.h とかやって適宜場所を見つけてあげてください。


(3).so作成

  • lstc++ をつけないとundefinedな参照が発生してしまう。

テスト

#!/usr/bin/perl -w
use strict;
use lib '/home/higepon/swig/test';
use HatenaSwig;

sub main {
	my $hige = HatenaSwig::Hige->new;
	print $hige->toString . "\n";
}

main();


結果

[test]$ ./test.pl
Hige

というわけで簡単に出来ました。
今回調べた資料は、はてなブックマークにブックマークしておきました。
http://b.hatena.ne.jp/higepon/swig/


ところで SWIGってなんて読むんでしょうか?教えてえらい人ヽ(´ー`)ノ