这个问题已经被提出了很多次,但是Visual Studio仍然让我感到挑战。
我们有一个应用程序,应该是自给自足的,即不依赖于任何第三方库。这就是为什么我们使用MT(d)代码生成标志构建所有内容的原因。
该应用程序依赖于Qt、zlib、OpenSSL和DCMTK。所有这些库都是使用MT(d)作为静态库构建的。应用程序还使用了一些与MFC相关的代码,所以我们也必须链接它。
MFC是通过以下方式包含的:
我们有一个应用程序,应该是自给自足的,即不依赖于任何第三方库。这就是为什么我们使用MT(d)代码生成标志构建所有内容的原因。
该应用程序依赖于Qt、zlib、OpenSSL和DCMTK。所有这些库都是使用MT(d)作为静态库构建的。应用程序还使用了一些与MFC相关的代码,所以我们也必须链接它。
MFC是通过以下方式包含的:
#include <afxwin.h>
我在某处看到说这应该是每个文件中的第一个include,但我不确定是否正确。无论如何,这一行并不包含在每个文件中,只有一个文件包含它。
以下是与链接相关的错误:
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 KB的文章。但是它们都没有帮助我,因为它们都说MFC libs应该在CRT之前链接,但我找不到改变链接顺序的方法。
非常感谢任何帮助。
编辑1: 使用此线程中的技巧实际上解决了问题,但我仍然想知道这里出了什么问题。
编辑2: 使用Visual Studio 2008 SP1,在Windows 7和Qt 4.6.3上。