Visual Studio链接错误。MFC和CRT的包含顺序有关系吗?

4
这个问题已经被提出了很多次,但是Visual Studio仍然让我感到挑战。
我们有一个应用程序,应该是自给自足的,即不依赖于任何第三方库。这就是为什么我们使用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上。


你使用的是哪个版本的Visual Studio? - karlphillip
2个回答

4
问题很明显:您正在将CRT和MFC代码一起编译。
当您使用MFC库时,必须确保它们在CRT库之前链接。您可以通过确保项目中的每个文件首先包含Msdev \ Mfc \ Include \ Afx.h来实现此目的,直接(#include)或间接(#include)。Afx.h包含文件使用指令强制正确的库顺序:
#pragma comment (lib,"")
Microsoft有一篇文章(链接已失效,但请在此处检查),描述了这个问题并提供了2个逐步解决方案(以下步骤基于Visual C++ 6.0)。
解决方案一:强制链接器按正确顺序链接库
1. 在“项目”菜单上,单击“设置”。 2. 在“项目设置”对话框的“设置视图”中,单击以选择正在出现链接错误的项目配置。 3. 在“链接”选项卡上,在“类别”组合框中单击以选择“输入”。 4. 在“忽略库”框中插入库名称(例如,Nafxcwd.lib;Libcmtd.lib)。
注意:在命令行中,等效于链接器的参数为/NOD:<库名称>。
5. 在“对象/库模块”(VS2008:属性->配置属性->链接器->输入->附加依赖项)框中,插入库名称。您必须确保这些库按顺序列出,并作为第一和第二个库列在该行中(例如,Nafxcwd.lib Libcmtd.lib)。
解决方案二:查找并更正问题模块
要查看当前库链接顺序,请执行以下操作:
1. 在“项目”菜单上,单击“设置”。 2. 在“项目设置”对话框的“设置视图”中,单击以选择正在出现链接错误的项目配置。 3. 在“链接”选项卡上,在“项目选项”框中键入/verbose:lib。 4. 重新生成您的项目。在链接过程中,库将在输出窗口中列出。

那么,我如何定位问题模块? - ak.
@ak 他们在我上面指出的页面中描述了如何做。我建议你打开它,仔细看一下。 - karlphillip
在解决方案二中,他们只描述了获取链接器输出的步骤。我已经完成了这个步骤,并且如我在问题中提到的那样,链接器输出在这里http://pastebin.com/9qWbnbC5。但是我正在查看它,我只能假设CRT在MFC之前被链接,但没有解释为什么会发生这种情况... - ak.
上述 MSDN 链接已经失效,不确定微软的这些人在删除帮助页面之前是否考虑过。 - A.B.
@A.B. 已更新答案。 - karlphillip

0

1
这正是我在两天前回答你之前所说的,你在那里得到帮助后又回来发表了这个答案。 - karlphillip
@karlphillip 对于 @ak 来说并不明显,对我来说也是如此,就是当你在 /verbose:lib 输出中看到问题时,如何解决它。对我来说,这个 解决了我的问题。 - darda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接