とりあえず簡単な拡張ライブラリがビルドできたのでメモ。
一応、動作確認済み。
escape_ext.soも修正しないと。
ビルド環境
サンプルライブラリ
こちらのページのCounterクラスを拝借。
__declspec(dllexport) void Init_counter(void); #include "ruby.h" struct counter { int count; }; static VALUE counter_alloc(VALUE klass) { struct counter *ptr = ALLOC(struct counter); return Data_Wrap_Struct(klass, 0, -1, ptr); } static VALUE counter_initialize(VALUE self) { struct counter *ptr; Data_Get_Struct(self, struct counter, ptr); ptr->count = 0; return Qnil; } static VALUE counter_count(VALUE self) { struct counter *ptr; Data_Get_Struct(self, struct counter, ptr); return INT2FIX(ptr->count); } static VALUE counter_increment(VALUE self) { struct counter *ptr; Data_Get_Struct(self, struct counter, ptr); ptr->count++; return self; } void Init_counter(void) { VALUE Counter; Counter = rb_define_class("Counter", rb_cObject); rb_define_alloc_func(Counter, counter_alloc); rb_define_private_method(Counter, "initialize", counter_initialize, 0); rb_define_method(Counter, "increment", counter_increment, 0); rb_define_method(Counter, "count", counter_count, 0); }
ビルド
%RUBY_HOME%/lib/ruby/1.8/i386-mswin32/config.hの先頭の3行をコメントアウト。
/* #if _MSC_VER != 1200 #error MSC version unmatch #endif */ #define STDC_HEADERS 1
「Set Windows 2000 Build Environment (Retail)」のプロンプトから。
set RUBY_HOME=C:\usr\local\ruby-1.8
cl /LD /Fecounter.so /I%RUBY_HOME%\lib\ruby\1.8\i386-mswin32 counter.c msvcrt-ruby18.lib /link /LIBPATH:%RUBY_HOME%\lib