Этот вопрос неоднократно поднимался, но Visual Studio не перестает меня оспаривать.
У нас есть приложение, которое должно быть самодостаточным, то есть не зависеть от сторонних библиотек. Вот почему мы строим все статически, используя MT(d)
флаги генерации кода.
Приложение зависит от Qt
, zlib
, OpenSSL
и DCMTK
. Все эти библиотеки были созданы как статические библиотеки с MT(d)
. Приложение также использует некоторый связанный с MFC
код, поэтому мы также должны ссылаться на него.
MFC включен через
#include <afxwin.h>
Я где-то читал, что это должно быть первое включение в каждом файле, но я не уверен, правда ли это. В любом случае, строка не включена в каждый файл, только один файл включает ее.
Вот ошибки, связанные со ссылкой:
Error 24 error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) uafxcwd.lib
Error 22 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) uafxcwd.lib
Error 23 error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj) uafxcwd.lib
Error 21 error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) uafxcwd.lib
Вот вывод компоновщика .
Я прочитал много тем на многих сайтах, а также эту статью из КБ MSDN. Но они не помогают мне, поскольку все они продолжают говорить, что библиотеки MFC должны быть связаны до CRT, но я не могу найти способ изменить порядок ссылок.
Любая помощь очень ценится.
Редактировать 1 :
Используя трюк из этот поток фактически решает проблему, но я все еще хочу знать, что здесь не так.
Редактировать 2 :
Использование Visual Studio 2008 SP1 в Windows 7 и Qt 4.6.3