[Gauche-devel-jp] Re: main.c で Scm_PairClass が見つからない

Back to archive index

shelarcy shela****@capel*****
2004年 6月 27日 (日) 21:14:20 JST


On Sun, 27 Jun 2004 00:23:52 -1000 (HST), Shiro Kawai <shiro****@lava*****> 
wrote:
>> 参考までに gauche.def を添付しておきます。
>
> ああ、確かに、関数しかexportされてませんね。
> それにしてもfoo_dataでうまくいくのはなんでだろう。

関数を定義してやる。

int foo_func () {
   return 1;
}

問題なし

LIBRARY foo.dll
EXPORTS
foo_data DATA
foo_func


export のための条件を作る (WIN32_NATIVE は宣言済み)

#if defined(__CYGWIN__) || WIN32_NATIVE
#  define SCM_EXTERN extern __declspec(dllexport)
# else
#  define SCM_EXTERN extern __declspec(dllimport)
#endif

int foo_data = 1;

SCM_EXTERN int foo_func () {
   return 1;
}


foo_data の定義がない

LIBRARY foo.dll
EXPORTS
foo_func

__declspec(dllimport) のための条件は作らない場合

#if defined(__CYGWIN__)
#  define SCM_EXTERN extern __declspec(dllexport)
# else
#  define SCM_EXTERN extern
#endif

問題なし

LIBRARY foo.dll
EXPORTS
foo_data DATA
foo_func


どうやら cygwin を真似てこう定義したのが悪いようですが、

/* Ugly cliche for Win32. */
#if defined(__CYGWIN__) || WIN32_NATIVE
# if defined(LIBGAUCHE_BODY)
#  define SCM_EXTERN extern __declspec(dllexport)
# else
#  define SCM_EXTERN extern __declspec(dllimport)
# endif
#else  /*!__CYGWIN__ && !WIN32_NATIVE*/
# define SCM_EXTERN extern
#endif /*!__CYGWIN__ && !WIN32_NATIVE*/


定義しないならしないで、こうなりますし……


gcc.compile.c bin\gcc\debug\main.o
gcc.link bin\gcc\debug\gosh.exe
Info: resolving _Scm_PairClass by linking to __imp__Scm_PairClass 
(auto-import)
d000033.o(.idata$5+0x0): multiple definition of `_imp__Scm_PairClass'
d000019.o(.idata$5+0x0): first defined here
d000033.o(.idata$6+0x0): multiple definition of `_nm__Scm_PairClass'
d000019.o(.idata$6+0x0): first defined here


-- 
shelarcy <shela****@capel*****>
http://page.freett.com/shelarcy/



Gauche-devel-jp メーリングリストの案内
Back to archive index