я пытаюсь собрать асеприт (https://github.com/aseprite/aseprite) в Windows XP, используя Mingw. У меня не было проблем с cmake и make, пока компоновщик не попытается связать dxguid.obj. Затем я получаю следующую ошибку:
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))
,
Других решений пока нет …