正在msys(MinGW)中链接dxguid.obj

Linking dxguid.obj in msys (MinGW)

本文关键字:链接 dxguid obj msys MinGW 正在      更新时间:2023-10-16

我正在尝试编译aseprite(https://github.com/aseprite/aseprite)在windowsxp中使用mingw。在链接器尝试链接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,但链接器需要它。所以,我不知道如何解决这种情况。

这两个库(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))