shelarcy
shela****@capel*****
2004年 7月 12日 (月) 19:40:59 JST
On Mon, 12 Jul 2004 18:47:22 +0900, shelarcy <shela****@capel*****> wrote: >> 結構謎なのが uvinit.c の >> >> -void Scm_Init_libgauche_uvector(void) >> +SCM_EXTERN void Scm_Init_libgauche_uvector(void) >> >> この変更で動いちゃうところ。 >> SCM_EXTERN じゃなくて extern だったらどうなります? > > export されません。 > 原因はこの辺りにあって、そこでの仕組みが泥縄的に展開されてます。 > > http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2004-June/000883.html > >> あと、libgauche-uvector は -Wl,-export-all-symbols 付きでリンクされてま >> すか? > > というところで気がついたのですが、それ付きでリンクされているとしても無視 > する仕組みが働いてしまっているのではないかな、ということ。 もしやと思ってこうすると問題は解決しました。 --- gauche.h.2~ Mon Jul 12 07:44:42 2004 +++ gauche.h Mon Jul 12 18:59:25 2004 @@ -76,7 +76,7 @@ /* Ugly cliche for Win32. */ #if defined(__CYGWIN__) || WIN32_NATIVE # if defined(LIBGAUCHE_BODY) -# define SCM_EXTERN extern __declspec(dllexport) +# define SCM_EXTERN extern # else # define SCM_EXTERN extern __declspec(dllimport) # endif @@ -279,7 +279,7 @@ #define SCM_CPP_CAT(a, b) a ## b #define SCM_CPP_CAT3(a, b, c) a ## b ## c -#define SCM_CLASS_DECL(klass) SCM_EXTERN ScmClass klass +#define SCM_CLASS_DECL(klass) extern ScmClass klass #define SCM_CLASS_STATIC_PTR(klass) (&klass) /* A common header for all Scheme objects */ というわけできちんと全てのシンボルが export されるようになったので、 元に戻します。 --- uvinit.c.2~ Mon Jul 12 18:58:03 2004 +++ uvinit.c Mon Jul 12 19:03:04 2004 @@ -75,7 +75,7 @@ SCM_EXTERN ScmObj (*Scm_ReadUvectorHook)(ScmPort *port, const char *tag, ScmReadContext *ctx); -SCM_EXTERN void Scm_Init_libgauche_uvector(void) +void Scm_Init_libgauche_uvector(void) { ScmModule *m; ScmObj t; ……なんだろこの仕様。 そこからの連想で以下のように定義してやれば gc.dll がインポートできるだろう と思ったのですが、成功しませんでした。 #if defined(__MINGW32__) && defined(GC_DLL) # ifdef GC_BUILD # define GC_API extern # else # define GC_API extern __declspec(dllimport) # endif #endif gauche\bin\gcc\release\bignum.o(.text+0x80):bignum.c: undefined reference to `_imp__GC_malloc_atomic' -- shelarcy <shela****@capel*****> http://page.freett.com/shelarcy/