【问题标题】:Linking dxguid.obj in msys (MinGW)在 msys (MinGW) 中链接 dxguid.obj
【发布时间】:2016-07-13 06:35:32
【问题描述】:

我正在尝试使用 mingw 在 windows xp 中编译 aseprite (https://github.com/aseprite/aseprite)。在链接器尝试链接 dxguid.obj 之前,我对 cmake 和 make 没有任何问题。然后,我收到以下错误:

dxguid.lib(e:/temp/193462/obj.x86fre/misc/dxguid/daytona/objfre/i386/dxguid.obj):(.rdata[_GUID_MIN_POWER_SAVINGS]+0x0): first defined here libuuid.a(lib32_libuuid_a-uuid.o):uuid.c:(.rdata$GUID_MAX_POWER_SAVINGS[_GUID_MAX_POWER_SAVINGS]+0x0): multiple definition of `GUID_MAX_POWER_SAVINGS'

dxguid 和 libuiid 之间似乎存在定义冲突。我尝试删除 libuiid 但链接器需要它。所以,我不知道如何解决这种情况。

【问题讨论】:

    标签: c++ linker directx mingw-w64 msys2


    【解决方案1】:

    这两个库(DXGUID 和 UUID)实际上不包含任何代码,仅包含用于定义 GUID 的数据段。任何一个库都应该适合定义 GUID。

    这在 Visual C++ 中通过#pragma __declspec(selectany) 自动处理。如果您查看guiddefs.h,您会看到:

    #ifndef DECLSPEC_SELECTANY
    #if (_MSC_VER >= 1100)
    #define DECLSPEC_SELECTANY  __declspec(selectany)
    #else
    #define DECLSPEC_SELECTANY
    #endif
    #endif
    

    ...

    #ifdef INITGUID
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID DECLSPEC_SELECTANY name \
                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
    #else
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID FAR name
    #endif // INITGUID
    

    在 GCC 中,这应该等同于 __attribute__((weak))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多