这个问题已被提出多次,但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的KB中的article。但他们并没有帮助我,因为所有人都说在MCR之前应该链接MFC库,但我找不到改变链接顺序的方法。
非常感谢任何帮助。
修改1 : 使用来自this thread的技巧实际上解决了这个问题,但我仍然想知道这里有什么问题。
编辑2 : 在Windows 7和Qt 4.6.3上使用Visual Studio 2008 SP1
答案 0 :(得分:4)
问题很明显:您正在一起编译CRT和MFC代码。
当您使用MFC库时,您 必须确保它们是相互关联的 在CRT库链接之前。您 可以通过确保每一个来做到这一点 您的项目中的文件包括 Msdev \ Mfc \首先包括\ Afx.h 直接(#include)或 间接地(#include)。该 Afx.h包含文件强制正确 库的顺序,使用指令:
#pragma comment (lib,"<libname>")
Microsoft has an article(链接现已消失,but check here)描述此问题并逐步建议2个解决方案(以下步骤基于Visual C ++ 6.0 ):
解决方案一:强制链接器以正确的顺序链接库
- 在“项目”菜单上,单击“设置”。
- 在“项目设置”对话框的“设置”视图中,单击以选择导致链接错误的项目配置。
- 在“链接”选项卡上,单击以在“类别”组合框中选择“输入”。
- 在“忽略库”框中,插入库名称(例如,Nafxcwd.lib; Libcmtd.lib)。
醇>注意:
/NOD:<library name>
中的链接器命令行等效项。
- 在对象/库模块(VS2008:属性 - >配置属性 - >链接器 - >输入 - >附加依赖关系)框中,插入库名称。您必须确保这些按顺序列出并作为行中的前两个库(例如,Nafxcwd.lib Libcmtd.lib)。
醇>解决方案二:找到并纠正问题模块
要查看当前库链接顺序,请按以下步骤操作:
- 在“项目”菜单上,单击“设置”。
- 在“项目设置”对话框的“设置”视图中,单击以选择导致链接错误的项目配置。
- 在“链接”选项卡上,在“项目选项”框中键入/ verbose:lib。
- 重建您的项目。在链接过程中,库将在输出窗口中列出。
醇>
答案 1 :(得分:0)