共有ライブラリをRubyで使う
SWIGを使えばできるということなので試してみました。ライブラリは一昨日作ったlibcalc.so.1とcalc.hです。
前準備
libcalc.so.1は標準的なライブラリ置き場へ、calc.hは適当な作業ディレクトリへ置く
# cp libcalc.so.1 /opt/QtPalmtop/lib/ # ln -s /opt/QtPalmtop/lib/libcalc.so.1 /opt/QtPalmtop/lib/libcalc.so
SWIGのコンパイル&インストール
本家からswig-1.3.31.tar.gzを持ってきて展開、zgcc42な環境で特に問題もなくコンパイル完了。一応ipkにしてからインストール
なおコンパイルはQtopiaな環境だとメモリ不足で落ちたのでQtopiaを抜けて行いました。
$ ./configure --prefix=/opt/QtPalmtop \ CFLAGS=-static-libgcc \ # libgcc_s.soとlibstd++.soをstaticにリンクする場合 CPPFLAGS=-static-libgcc \ # CXXFLAGS=-static-libgcc \ # LDFLAGS='-static-libgcc -L.' \ # ここまで、libstd++.aは予めカレントにコピっておく --with-ruby=/home/QtPalmtop/bin/ruby \ --without-tcl --without-python \ --without-perl5 --without-java \ 以下略(ruby以外は使用しないのでwithoutに) $ make
Ruby用ライブラリ作成
ソースに付属するSWIGのドキュメントに従って作業。以下はcalc.hのあるディレクトリで実施
- calc.iの作成、SWIGで使用する大本のファイル。内容は理解してません(^^ゞ
%module calc %{ #include "calc.h" %} %include "calc.h"
$ swig -c++ -ruby calc.i
- extconf.rbの作成、c++の場合は二行目が必要らしい。三行目のシングルクオートの中以外はいつも共通(だと思う)
require 'mkmf' $libs = append_library($libs, "supc++") create_makefile('calc')
- Makefike作成
$ ruby extconf.rb
- できたMakefikeのLIBS行に-lcalcを追加
- makeでコンパイル
$ ldd calc.so libruby.so.1.8 => /opt/QtPalmtop/lib/libruby.so.1.8 (0x4001c000) libdl.so.2 => /lib/libdl.so.2 (0x400e6000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x400f1000) libm.so.6 => /lib/libm.so.6 (0x40126000) libc.so.6 => /lib/libc.so.6 (0x40154000) libcalc.so.1 => /opt/QtPalmtop/lib/libcalc.so.1 (0x4026f000) /opt/zgcc42/lib/ld-linux.so.2 => /opt/zgcc42/lib/ld-linux.so.2 (0x2aaaa000) libgcc_s.so.1 => /opt/QtPalmtop/lib/libgcc_s.so.1 (0x40279000) <-これは標準のザウルスには存在しないので注意