なにはともあれパッケージでRubyの開発環境を整えよう。私の場合はDebian(lenny)なのでaptitude経由となります。
$sudo aptitude install ruby1.8-dev $cd /usr/local/include #シンボリックリンクの作成 #作成する場所はお好みで $sudo ln -s /usr/lib/ruby/1.8/i486-linux ./ruby
追記:自分でMakefile書くわけじゃないので、シンボリックリンクの作成はいらないかもしれません。
次はCソースコードの用意。
precure.c
#include <ruby.h> /** * va+vb+vcを返すだけのメソッド * @param va, vb, vc 足す数 * @return va+vb+vc の答え */ VALUE heart_catch(VALUE self, VALUE va, VALUE vb, VALUE vc) { VALUE r; int a, b, c, d; a = NUM2INT(va); b = NUM2INT(vb); c = NUM2INT(vc); d = a + b + c; r = INT2FIX(d); return r; } void Init_Precure(void) { /* 初期化処理 */ VALUE rb_cPrecure; rb_cPrecure = rb_define_class("Precure", rb_cObject); /* メソッド定義 */ rb_define_method(rb_cPrecure, "heart_catch", heart_catch, 3); }コンパイルは特別なMakefileで行う。このMakefileを作るためにextconf.rb(名前は適当でいい)を作成する。
extconf.rb
require "mkmf" #作成したいクラス名と同じ名前を指定する。 create_makefile("Precure")Shell上で、
$ruby extconf.rb creating Makefile $make 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 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にて
require "Precure.so" precure = Precure.new d = precure.heart_catch(1, 2, 3) print d, "\n"と記述して実行すると6という出力が得られる。
次はC/C++からRubyを呼び出す方法を勉強しよう。
0 件のコメント:
コメントを投稿