http://members.jcom.home.ne.jp/mitakelp/makeext.html
なにはともあれパッケージでRubyの開発環境を整えよう。私の場合はDebian(lenny)なのでaptitude経由となります。
1 | $ sudo aptitude install ruby1.8-dev |
6 | $ sudo ln -s /usr/lib/ruby/1.8/i486-linux ./ruby |
追記:自分でMakefile書くわけじゃないので、シンボリックリンクの作成はいらないかもしれません。
次はCソースコードの用意。
precure.c
08 | VALUE heart_catch(VALUE self, VALUE va, VALUE vb, VALUE vc) |
24 | void Init_Precure( void ) |
29 | rb_cPrecure = rb_define_class( "Precure" , rb_cObject); |
32 | rb_define_method(rb_cPrecure, "heart_catch" , heart_catch, 3); |
コンパイルは特別なMakefileで行う。このMakefileを作るためにextconf.rb(名前は適当でいい)を作成する。
extconf.rb
4 | create_makefile( "Precure" ) |
Shell上で、
4 | cc -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -c precure.c |
5 | cc -shared -o Precure.so precure.o -L. -L/usr/lib -L. -rdynamic -Wl,- export -dynamic -lruby1.8 -lpthread -ldl -lcrypt -lm -lc |
すると、Precure.soなる共有オブジェクトができているので、useprecure.rbにて
4 | d = precure.heart_catch(1, 2, 3) |
と記述して実行すると6という出力が得られる。
次はC/C++からRubyを呼び出す方法を勉強しよう。
0 件のコメント:
コメントを投稿