Makoto Satoh
makot****@yahoo*****
2005年 4月 21日 (木) 00:13:54 JST
> しかし今度はエラーメッセージが変わりました。 > > $ make check > /usr/local/bin/gosh -I. test.scm > test.log > Testing gd ... *** ERROR: failed to link "gd" dynamically: . > /gd.so: undefined symbol: Scm_GdFontPtrClass > Stack Trace: > _______________________________________ > make: *** [check] エラー 70 ちょっと調べて以下のようなことが分かりました。 $ ldd -r gd.so libgauche.so.0 => /usr/local/lib/libgauche.so.0 (0x40021000) libdl.so.2 => /lib/tls/libdl.so.2 (0x400ea000) libcrypt.so.1 => /lib/tls/libcrypt.so.1 (0x400ed000) libutil.so.1 => /lib/tls/libutil.so.1 (0x4011a000) libm.so.6 => /lib/tls/libm.so.6 (0x4011d000) libpthread.so.0 => /lib/tls/libpthread.so.0 (0x4013f000) libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x4014e000) libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x4016d000) libpng12.so.0 => /usr/lib/libpng12.so.0 (0x401da000) libz.so.1 => /usr/lib/libz.so.1 (0x401ff000) libgd.so.2 => /usr/lib/libgd.so.2 (0x40211000) libc.so.6 => /lib/tls/libc.so.6 (0x40260000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) undefined symbol: Scm_GdFontPtrClass (./gd.so) undefined symbol: gdFTUserFontConfig (./gd.so) このうち後者については、綴りが間違っていました。UserではなくUseでした。 これを直したところ、前者だけが残るようになりました。 これは、私がgd.stubで新規に書いたものなのですが、あまり意味は分からずに サンプルを見て真似ただけなので、そこに問題がありそうです。で、 $ nm -D gd.so | grep Scm_Gd 00015320 D Scm_GdClass U Scm_GdFontPtrClass ということで、前者はグローバルデータとして存在しているのに後者は 未定義というのがおかしそうですね。 どちらもgd.stubで自分で定義しているのですが、違う扱いになっているところを 探してみると、 /* Hack for initialization stub */ static void Scm_gd_internal_init(ScmModule*); void Scm_Init_gd(void) { ScmModule *mod; SCM_INIT_EXTENSION(gd); mod = SCM_MODULE(SCM_FIND_MODULE(\"gd\", TRUE)); Scm_InitStaticClass(&Scm_GdClass, \"<gd>\", mod, NULL, 0); Scm_gd_internal_init(mod); } #define Scm_Init_gd Scm_gd_internal_init ここではScm_GdFontPtrClassについて何も書かれていませんが、 s/Scm_GdClass/Scm_GdFontPtrClass/、s/gd/gdfont/とした行を 追加してみたりしましたが、これはモジュールの初期化なので 違ったようです。 class.cの289行目からの説明には、SCM_DEFINE_***_CLASSで クラスの静的なパートを定義した後、Scm_InitStaticClassで 動的な部分を初期化するとありますが、ここは使い方がまだ よく分かっていません。試行錯誤してみましたが、うまくいきません でした。二重定義エラーみたいなものが出ました。 他には、 (define-cclass <gd> "ScmGd*" "Scm_GdClass" () ()) は書いてあって、ScmGdFontPtrについては書いてありませんでした。 そこで、 (define-cclass <gdfont> "ScmGdFontPtr*" "Scm_GdFontPtrClass" () ()) を書き足したところ、ldd -r gd.soでもundefined symbolとして表示 されなくなり、 $ nm gd.so | grep Scm_Gd 00015340 D Scm_GdClass 000153e0 D Scm_GdFontPtrClass となりました。結果、 $ make check /usr/local/bin/gosh -I. test.scm > test.log Testing gd ... failed. discrepancies found. Errors are: test bindings in module gd: expects () => got "symbols exported but not defined: (gd-iamge-true-color)" test gd-image-destroy: expects #t => got #<error "Image object was not correctly passed."> テストは失敗してますが(綴り間違いと何かですね)、gd.soはロードできました。 仕組みについてはぼやーっとしか分かっていませんが、何とか解決できたようです。 genstubの吐くコードやgauche.hで定義されているマクロや関数の使い方などの ドキュメントが欲しいところです。まだこの辺は変わりそうでしょうか? 大変興味深く読ませていただいてます。 ;;; Cをほとんど書いたことがないのがばればれですね。 長文失礼しました。 -- 佐藤