From: Akimichi Tatsukawa Date: 2000-06-25T13:00:53+09:00 Subject: [ruby-list:23504] 拡張ライブラリの作り方 立川と申します。はじめて投稿します。よろしくお願いします。 clipsという言語をrubyの拡張ライブラリとして組み込むことを考えています。 とりあえず言語の初期化を行なう InitializeClips という関数のみを 試験的に組み込もうしています。 静的コンパイルは成功したのですが、テストのスクリプトを実行すると 以下のメッセージを吐きます。 どこがダメなのか教えてください。 ./test.rb:5: undefined method `InitializeClips' for # (NameError) 以下はrubyとのインターフェイスを記述したファイル rubyinterface.c です。 #include "ruby.h" #include "rubysig.h" #include "sysdep.h" void clips_InitializeEnvironment(VALUE self){ InitializeEnvironment(); // この関数は 上記の sysdep.h で宣言されています。 } void Init_clips(){ VALUE mClips = rb_define_module("Clips"); rb_define_module_function((VALUE)mClips, "InitializeEnvironment", (VALUE(*)())clips_InitializeEnvironment,0); } 以下は、テスト用のスクリプトです。 require 'clips' include Clips InitializeClips() 以下はコンパイルの際のメッセージです。 compiling clips make[1]: Entering directory `/usr/src/local/lang/ruby-1.4.4/ext/clips' gcc -I/usr/src/local/lang/ruby-1.4.4 -I/usr/src/local/lang/ruby-1.4.4 -g -$O_2$ -I/usr/src/local/lang/ruby-1.4.4 -I/usr/src/local/lang/ruby-1.4.4/ext -I/usr/src/local/lang/ruby-1.4.4/ext/clips -I/usr/local/include -c agenda.c -o agenda.o 以下、延々とコンパイルが続く。 gcc -I/usr/src/local/lang/ruby-1.4.4 -I/usr/src/local/lang/ruby-1.4.4 -g -$O_2$ -I/usr/src/local/lang/ruby-1.4.4 -I/usr/src/local/lang/ruby-1.4.4/ext -I/usr/src/local/lang/ruby-1.4.4/ext/clips -I/usr/local/include -c rubyinterface.c -o rubyinterface.o ar cru clips.a agenda.o analysis.o argacces.o bload.o bmathfun.o bsave.o classcom.o classexm.o classfun.o classinf.o classini.o classpsr.o clsltpsr.o commline.o conscomp.o constrct.o constrnt.o crstrtgy.o cstrcbin.o cstrccom.o cstrcpsr.o cstrnbin.o cstrnchk.o cstrncmp.o cstrnops.o cstrnpsr.o cstrnutl.o default.o defins.o developr.o dffctbin.o dffctbsc.o dffctcmp.o dffctdef.o dffctpsr.o dffnxbin.o dffnxcmp.o dffnxexe.o dffnxfun.o dffnxpsr.o dfinsbin.o dfinscmp.o drive.o edbasic.o edmain.o edmisc.o edstruct.o edterm.o emathfun.o engine.o inscom.o evaluatn.o expressn.o exprnbin.o exprnops.o exprnpsr.o extnfunc.o factbin.o factbld.o factcmp.o factcom.o factfun.o factgen.o facthsh.o factlhs.o factmch.o factmngr.o factprt.o factrete.o factrhs.o filecom.o filertr.o generate.o genrcbin.o genrccmp.o genrccom.o genrcexe.o genrcfun.o genrcpsr.o globlbin.o globlbsc.o globlcmp.o globlcom.o globldef.o globlpsr.o immthpsr.o incrrset.o inherpsr.o insfile.o insfun.o insmngr.o insmoddp.o insmul! ! t.o inspsr.o insquery.o insqypsr.o iofun.o lgcldpnd.o main.o memalloc.o miscfun.o modulbin.o modulbsc.o modulcmp.o moduldef.o modulpsr.o modulutl.o msgcom.o msgfun.o msgpass.o msgpsr.o multifld.o multifun.o objbin.o objcmp.o objrtbin.o objrtbld.o objrtcmp.o objrtfnx.o objrtgen.o objrtmch.o parsefun.o pattern.o pprint.o prccode.o prcdrfun.o prcdrpsr.o prdctfun.o prntutil.o proflfun.o reorder.o reteutil.o retract.o router.o rulebin.o rulebld.o rulebsc.o rulecmp.o rulecom.o rulecstr.o ruledef.o ruledlt.o rulelhs.o rulepsr.o scanner.o sortfun.o strngfun.o strngrtr.o symblbin.o symblcmp.o symbol.o sysdep.o textpro.o tmpltbin.o tmpltbsc.o tmpltcmp.o tmpltdef.o tmpltfun.o tmpltlhs.o tmpltpsr.o tmpltrhs.o tmpltutl.o userdata.o utility.o watch.o rubyinterface.o make[1]: Leaving directory `/usr/src/local/lang/ruby-1.4.4/ext/clips' gcc -g -O2 -c extinit.c make[1]: Entering directory `/usr/src/local/lang/ruby-1.4.4' gcc -g -O2 -rdynamic main.o ext/extinit.o ext/fzclips/fzclips.a ext/clips/clips.a ext/units/units.a libruby.a -ldl -lcrypt -lm -L/usr/src/local/lang/ruby-1.4.4/ext/fzclips -lc -L/usr/src/local/lang/ruby-1.4.4/ext/clips -lc -lc -o ruby make[1]: Leaving directory `/usr/src/local/lang/ruby-1.4.4' なお nm で clips.a を調べたところ、次のようにInitializeEnvironment関数はライブラリの中に格納されて いました。 sysdep.o: 00000000 T InitializeEnvironment