KIMURA Shigenobu
skimu****@mac*****
2004年 7月 12日 (月) 15:31:14 JST
On Jul 11, 2004, at 11:07 AM, KIMURA Shigenobu wrote: > 違います。今忙しいから後で説明します。 ですが、shiro さんのいっていた正しい作法とは gauche.h の中で # if defined(LIBGAUCHE_BODY) # define SCM_EXTERN extern __declspec(dllexport) # else # define SCM_EXTERN extern __declspec(dllimport) # endif とすること、つまり libgauche の中でインクルードされるときは 「こいつらはlibgauche外から参照していいっすよ」 また、uvector などの外部のライブラリからインクルードさるときは 「こいつらはこのライブラリの外に実体があるよ」 と一々指定しなくてはならなかったのだけど、前者に関しては > ところがcygwinではいつからか、__declspec(dllexport)をつけてなくても > グローバルシンボルは自動的に全部exportしてくれる機能がつきました。 > -Wl,--export-all-symbolsがそれかな。そこで、これ幸いとdllexport > の方を無視することにした、 ので、現状の gauche.h の用になっているということです。 で gauche.h のこの変更ですが + +SCM_EXTERN ScmObj (*Scm_ReadUvectorHook)(ScmPort *port, const char *tag, + ScmReadContext *ctx); + この関数は uvinit.c の中だけからしか参照されないので、 gauche.h の中ではなく uvector.c にだけあればいのだけど、 ちゃんと 75 行めにありますねぇ。なにがいけないんだろ。 結構謎なのが uvinit.c の -void Scm_Init_libgauche_uvector(void) +SCM_EXTERN void Scm_Init_libgauche_uvector(void) この変更で動いちゃうところ。 SCM_EXTERN じゃなくて extern だったらどうなります? あと、libgauche-uvector は -Wl,-export-all-symbols 付きでリンクされてますか?