[Perl] はじめてのSWIG(PerlからC++のコードを呼び出してみよう)
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ってなんて読むんでしょうか?教えてえらい人ヽ(´ー`)ノ