MinGW和@N dll函数链接

时间:2013-05-12 09:50:10

标签: gcc dll linker mingw

我的'.h'文件包含以下内容:

#ifndef MY_IMPORT
    #define MY_IMPORT __declspec(dllimport) /* !!! */
#endif

#ifndef MY_EXPORT
    #define MY_EXPORT __declspec(dllexport)
#endif

#ifdef __cplusplus
    extern "C"{
#endif

MY_IMPORT VOID* WINAPI XXX_FUNC( VOID * ARG1, ... );

/* ... */

#ifdef __cplusplus
}
#endif

我有'lib.dll'库,它导出没有@N后缀的XXX_FUNC。

当我尝试构建我的dll(mydll.dll)时,我使用了这个lib.dll,我收到了GCC消息:

undefined reference to `__imp__XXX_FUNC@12'

我看了很多互联网,包括stackoverflow,但我找不到解决方案。 链接器称为:

g++ -shared -Wl,--enable-stdcall-fixup mydll.o -L. lib.dll -o mydll.dll 

正如我所知,GCC必须尝试将'_ imp _XXX_FUNC @ 12'链接到'_ imp _XXX_FUNC'和'--enable-stdcall -fixup'是唯一可以防止在这种情况下发出警告的选项,但是我的MinGW GCC不会尝试这个。

我已安装MinGW和GCC v4.7。

1 个答案:

答案 0 :(得分:0)

您需要在declspec(dllexport)处于活动状态时编译dll。您应该将MY_IMPORTMY_EXPORT替换为:

#ifdef _DLLifdef BUILDING_MY_DLL
# define MY_API __declspec(dllexport)
#else
# define MY_API __declspec(dllimport)
#endif

静态构建时,只需

#define MY_API

您如何确定,取决于您和您的构建系统。我已经看到了各种方法。然后,为要导出的每个符号添加MY_API

MY_IMPORT VOID* WINAPI XXX_FUNC( VOID * ARG1, ... );

这将导致DLL包含符号

__imp_XXX_FUNC...

还有一些其他的东西。请注意由于__imp_而添加的dllexport

是的,这是过时的(参见例如GCC的visibility归属),但这就是Windows的工作方式。