2

我有一个内容如下的“.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。

当我尝试使用此 lib.dll 构建我的 dll (mydll.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不要尝试这个。

我已经用 GCC v4.7 安装了 MinGW。

4

1 回答 1

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 的工作方式。

于 2013-05-12T10:49:03.387 回答