立石@JAISTです。

matz / netlab.co.jpさん(05月18日14時):
matz>>|# ruby って C++ で書かれたものも呼び出せるんですか?
matz>>
matz>>そのままではできません.現状では以下の手順を使って下さい.
matz>>
matz>>  * 通常の拡張モジュールを書く(拡張子は.c)
matz>>  * 拡張モジュール全体(あるいはプロトタイプ)をextern "C"で囲む
matz>>  * Makefileを生成
matz>>  * ファイルの拡張子,Makefile内の拡張子を.cc(or .C)に変更
matz>>  * コンパイル・リンク

そんなことってできたんですね、、、(^^;
ためしに、簡単なものを書いて試してみたら
ちゃんとできました。↓

------
extern "C" {

#include <stdio.h>
#include <string.h>
#include "ruby.h"

class Class{
  char message[15];
public:
  Class(char* str){
    strcpy(message,str);
  };
  
  VALUE print(){
      printf(message);
      printf("\n");
      return TRUE;
  };
};

VALUE cTEST;

VALUE oTEST_A;
VALUE oTEST_B;

VALUE print(VALUE self, VALUE val){
  Class *c;
  Data_Get_Struct(val,Class,c);
  return c->print();
};

Init_test(){
  Class *obj_a = new Class("this is a");
  Class *obj_b = new Class("this is b");

  oTEST_A = Data_Wrap_Struct(cObject,0,0,obj_a);
  oTEST_B = Data_Wrap_Struct(cObject,0,0,obj_b);
  rb_define_global_const("AAA",oTEST_A);
  rb_define_global_const("BBB",oTEST_B);

  cTEST = rb_define_class("TEST",cObject);
  rb_define_method(cTEST,"print",print,1);
};


};
---------


----------------------------------------------
Name	Takaaki Tateishi
E-Mail 	ttate / jaist.ac.jp
	tateishi / pluto.dti.ne.jp
URL	http://www.pluto.dti.ne.jp/~tateishi/
Org	School of Information Science
	Japan Advanced Institute of Science and Technology (JAIST)