hakeの日記

Windows環境でプログラミングの勉強をしています。

共有ライブラリを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でcalc_wrap.cxxを作る、-c++オプションはlibcalcがc++で作った為(だと思う)
$ swig -c++ -ruby calc.i
  • extconf.rbの作成、c++の場合は二行目が必要らしい。三行目のシングルクオートの中以外はいつも共通(だと思う)
require 'mkmf'
$libs = append_library($libs, "supc++")
create_makefile('calc')
  • Makefike作成
    • rubyは以前セルフコンパイルした1.8.6-p36を使いました。
    • dipsさんトコ(Focv)のRubyを使用する場合はrbconfig.rbの書き換えが必要になると思います。
$ ruby extconf.rb
  • できたMakefikeのLIBS行に-lcalcを追加
  • makeでコンパイル
    • /opt/QtPalmtop/lib/ruby/1.8/arm5telv-linux/intern.hの207行目でエラーになったので、コメントアウトした(いいのか?)
      • 1.8.6-p111を使ったらエラーになりませんでした
    • calc.soができる
    • lddの出力
$ 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)          <-これは標準のザウルスには存在しないので注意
    • calc.soを/opt/QtPalmtop/lib/ruby/site-ruby/1.8/arm5telv-linuxに置く

rubyで使う

irbで使ってみる

> require 'calc'            #=> true
> a = Calc::Calc.new        #=> #<Calc::Calc:0x402edcb4>
> a.add(3,2)                #=> 5
> a.sub(3,2)                #=> 1

ちゃんと使えました。


本当は

require 'calc'
include Calc
a = Calc.new

みたいに使えると思ったのですがエラーになるんですよね、この辺を何とかしたいものです。

    • 解決、10月4日の日記参照