ASRで拡張ライブラリを作成する

とりあえず簡単な拡張ライブラリがビルドできたのでメモ。
一応、動作確認済み。
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