【问题标题】:MinGW and @N dll functions linkingMinGW 和@N dll 函数链接
【发布时间】:2013-05-12 09:50:10
【问题描述】:

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

【问题讨论】:

    标签: gcc dll linker mingw


    【解决方案1】:

    您需要在 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...
    

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

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

    【讨论】:

    • 我在编译核心 dll 时定义了 '#define MY_IMPORT __declspec(dllexport)',而在尝试编译另一个使用核心 dll 的 dll 时没有定义它,因此 MY_IMPORT 自动定义为 __declspec( dllimport) 如标题中所写。当我尝试链接另一个使用核心 dll 的 dll 时出现问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多