我的'.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。
答案 0 :(得分:0)
您需要在declspec(dllexport)
处于活动状态时编译dll。您应该将MY_IMPORT
和MY_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的工作方式。