KIMURA Shigenobu
skimu****@mac*****
2004年 7月 11日 (日) 14:53:28 JST
On Jul 10, 2004, at 7:21 PM, shelarcy wrote: > On Sat, 10 Jul 2004 11:20:40 -0500, KIMURA Shigenobu <skimu****@mac*****> > wrote: >> どうやら上の定義時に >> #define SCM_CLASS_DECL(klass) extern ScmClass klass >> を以下のように書き換えると問題はなくなるようですが、何かまずい点はありま >> す >> か? >> #define SCM_CLASS_DECL(klass) SCM_EXTERN ScmClass klass > > 例のこれがここで問題を生じさせるようです。 SCM_EXTERN の定義を見てみると #if defined(__CYGWIN__) # if defined(LIBGAUCHE_BODY) # define SCM_EXTERN extern # else # define SCM_EXTERN extern __declspec(dllimport) # endif #else /*!__CYGWIN__*/ # define SCM_EXTERN extern #endif /*!__CYGWIN__*/ となっていて、 LIBGAUCHE_BODY は Gauche/src/ の中の C のソースファイル からインクルードされるときだけ定義されるので SCM_EXTERN は extern __declspec(dllimport) へ展開されます。 libgauche のなかに実体があって gauche.h の中で SCM_CLASS_DECL() されている Scm_StringClass は救われて、uvector.c のなかに実体が定義されている Scm_F64VectorClass は gauche/uvector.h の中でやはり SCM_CLASS_DECL() されてしまうのでコンパイラは DLL から読み込まれると思いこみ参照不能エラーが 出ててるんたど思います。たぶん。 ですから、SCM_CLASS_DECL() は外のDLLから参照するクラスを宣言する場合 と自前に実体をもっている場合で機能を切り替えてやらなくてなならなさそうです。 とりあえず、むっちゃくちゃばっちいですが、gauche.h 上のようなトリックと同じように uvector.c などの中で UVECTOR_BODY とかなんとか定義して、uvector.h のなかで SCM_CLASS_DECL を再定義してしまえばとりあえず、コンパイルは通るんじゃないかと #if defined(__CYGWIN__) # undef SCM_CLASS_DECL # if defined(UVECTOR_BODY) # define SCM_CLASS_DECL(klass) extern ScmClass klass # else # define SCM_CLASS_DECL(klass) SCM_EXTERN ScmClass klass # endif #endif うげげ、ばっちい。 しかし、全部の ext に対してやらなきゃいけないと思うと、、、しびれますねぇ。