[ C++で開発 ]
SWIG:Simplified Wrapper and Interface Generator をインストールして利用するまでの記録です。
SWIG総本山のサイトからソースを入手します。
2004年9月12日現在、SWIG 1.3.22が最新です。
ツール種類 | パス | 備考 |
Cコンパイラ | /opt/SUNWspro/bin/cc | |
C++コンパイラ | /opt/SUNWspro/bin/CC | |
makeツール | /usr/ccs/bin/make |
まず、SWIGソースコードを作業ディレクトリに展開します。
torutk$ mkdir work torutk$ cd work work$ tar xzf ~/swig-1.3.22.tar.gz work$ cd SWIG-1.3.22 SWIG-1.3.22$
コンパイラには、Sun Studio 9のCコンパイラおよびC++コンパイラを使用します。そこで、configureのオプションで指定します。
SWIG-1.3.22$ ./configure CC=cc CXX=CC : SWIG-1.3.22$
GNU makeではエラーになるようです。Solaris標準make(/usr/ccs/bin/make)を使用します。
SWIG-1.3.22$ make : SWIG-1.3.22$
デフォルトでは/usr/localの下にインストールされます。
SWIG-1.3.22$ su # PATH=$PATH:/usr/ccs/bin:/opt/SUNWspro/bin # make install Installing SWIG executable Installing /usr/local/bin/swig Installing the SWIG library Installing /usr/local/share/swig/1.3.22/_std_deque.i : Installing language specific files for tcl Installing /usr/local/share/swig/1.3.22/tcl/cstring.i : Installing language specific files for perl5 Installing /usr/local/share/swig/1.3.22/perl5/perlmain.i : Installing language specific files for python Installing /usr/local/share/swig/1.3.22/python/argcargv.i : Installing language specific files for guile Installing /usr/local/share/swig/1.3.22/guile/cplusplus.i : Installing language specific files for java Installing /usr/local/share/swig/1.3.22/java/arrays_java.i : Installing language specific files for mzscheme Installing /usr/local/share/swig/1.3.22/mzscheme/std_common.i : Installing language specific files for ruby Installing /usr/local/share/swig/1.3.22/ruby/embed.i : Installing language specific files for php4 Installing /usr/local/share/swig/1.3.22/php4/std_common.i : Installing language specific files for ocaml Installing /usr/local/share/swig/1.3.22/ocaml/carray.i : Installing language specific files for pike Installing /usr/local/share/swig/1.3.22/pike/std_string.i : Installing language specific files for chicken Installing /usr/local/share/swig/1.3.22/chicken/typemaps.i : Installing language specific files for csharp Installing /usr/local/share/swig/1.3.22/std_string.i : Installing language specific files for modula3 Installing /usr/local/share/swig/1.3.22/modula3/typemaps.i : Installing language specific files for allegrocl Installing /usr/local/share/swig/1.3.22/allegrocl/typemaps.i : Installation complete #
#include <string> using std::string; int getMaxPersons(); class Person { public: Person(); Person(const string& aName); ~Person() {} const string& getName() const; void setName(const string& newName); }; |
Person.cpp は略
%module address %{ #include "Person.hpp" %} %include "Person.hpp" |
SWIGのコマンドswigを実行して、Pythonから呼び出せるようにモジュールを作成します。
src$ swig -c++ -python -o address_wrap.cpp address.i src$ ls Person.cpp address.i address.pyc Person.hpp address.py address_wrap.cpp src$
共有ライブラリファイルの名前は、モジュール名と共有ライブラリファイル名が合っている必要があります。通常のようにlibXXX ではなく、libは付けません。
src$ CC -c address_wrap.cpp Person.cpp -KPIC -I/opt/sfw/include/python2.2 address_wrap.cpp: Person.cpp: src$ CC -G -o address.so Person.o address_wrap.o src$ ls Person.cpp Person.hpp address.py address_wrap.cpp address.so Person.o address.i address.pyc address_wrap.o src$
torutk$ python >>> import sys >>> sys.path.append("/export/home/torutk/python") >>> import address Traceback (most recent call last): File "<stdin>", line 1, in ? Import Error: ld.so.1: python: 重大なエラー: 再配置エラー: ファイル./address.so: シンボル __1cDstdMbasic_string4Ccn0ALchar_traits4Cc__n0AJallocator4Cc___2t6Mp kcrkn0C__v_: 参照シンボルが見つかりません。 >>>