Shiro Kawai
shiro****@lava*****
2004年 7月 11日 (日) 15:14:19 JST
だんだん思い出してきました。 From: KIMURA Shigenobu <skimu****@mac*****> Subject: [Gauche-devel-jp] Re: gosh の開発で行き詰まった Date: Sun, 11 Jul 2004 00:53:28 -0500 > >> どうやら上の定義時に > >> #define SCM_CLASS_DECL(klass) extern ScmClass klass > >> を以下のように書き換えると問題はなくなるようですが、何かまずい点はありま > >> す > >> か? > >> #define SCM_CLASS_DECL(klass) SCM_EXTERN ScmClass klass > > > > 例のこれがここで問題を生じさせるようです。 > > SCM_EXTERN の定義を見てみると [snip] > libgauche のなかに実体があって gauche.h の中で SCM_CLASS_DECL() されている > Scm_StringClass は救われて、uvector.c のなかに実体が定義されている > Scm_F64VectorClass は gauche/uvector.h の中でやはり SCM_CLASS_DECL() > されてしまうのでコンパイラは DLL から読み込まれると思いこみ参照不能エラーが > 出ててるんたど思います。たぶん。 本来、自分のDLL内で定義して外に見せる宣言には__declspec(dllexport)を、 外部DLLで定義されてて自分で参照する宣言には__declspec(dllimport)を つけるのが正しい作法らしいんですが、cygwin portをやってる時に、 上記のようにextensionのコンパイル時に問題が出た覚えがあります。 ところがcygwinではいつからか、__declspec(dllexport)をつけてなくても グローバルシンボルは自動的に全部exportしてくれる機能がつきました。 -Wl,--export-all-symbolsがそれかな。そこで、これ幸いとdllexport の方を無視することにした、のだったと思います。 一部のアーキテクチャのせいでコードが読みにくくなるのは避けたいので、 なんかcleverなトリックはないかしらん。 --shiro