shelarcy
shela****@capel*****
2004年 7月 11日 (日) 20:24:30 JST
On Sat, 10 Jul 2004 20:14:19 -1000 (HST), Shiro Kawai <shiro****@lava*****> wrote: >> 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なトリックはないかしらん。 そうですね、LIBGAUCHE_BODY ですね。今日歩きながら考えてました。 すると、Boost 上で無理やり定義してやって project gauche/ext/uvector : requirements <define>LIBGAUCHE_BODY : source-location ../../../ext/uvector ; SOURCES = uvector_head uvector uvutil uvinit uvlib uvector_tail ; lib uvector : $(SOURCES).c /gauche//gc /gauche//gauche : <include>../../../src <include>../../../gc/include <include>../../../ext/uvector ; えいっ。 gcc.link.dll ext\uvector\bin\gcc\release\uvector.dll Info: resolving _Scm_SequenceClass by linking to __imp__Scm_SequenceClass (auto-import) Info: resolving _Scm_CollectionClass by linking to __imp__Scm_CollectionClass (auto-import) Info: resolving _Scm_TopClass by linking to __imp__Scm_TopClass (auto-import) Info: resolving _Scm_ClassClass by linking to __imp__Scm_ClassClass (auto-import) Info: resolving _Scm_IntegerClass by linking to __imp__Scm_IntegerClass (auto-import) Info: resolving _Scm_RealClass by linking to __imp__Scm_RealClass (auto-import) Info: resolving _Scm_PairClass by linking to __imp__Scm_PairClass (auto-import) Info: resolving _Scm_VectorClass by linking to __imp__Scm_VectorClass (auto-import) Info: resolving _Scm_StringClass by linking to __imp__Scm_StringClass (auto-import) Info: resolving _Scm_ProcedureClass by linking to __imp__Scm_ProcedureClass (auto-import) Info: resolving _Scm_PortClass by linking to __imp__Scm_PortClass (auto-import) ext\uvector\bin\gcc\release\uvinit.o(.text+0x283):uvinit.c: undefined reference to `Scm_ReadUvectorHook' resolving は大丈夫ですよね。 すると残ったエラーは Scm_ReadUvectorHook だけですか。 cygwin では問題ないのにどこで問題が出てるんだろう? -- shelarcy <shela****@capel*****> http://page.freett.com/shelarcy/