4

这个问题已被多次提出,但 Visual Studio 从未停止挑战我。

我们有一个应用程序应该是自给自足的,即不依赖于任何第三方库。这就是我们使用MT(d)代码生成标志静态构建所有内容的原因。

该应用程序依赖于Qtzlib和。所有这些库都构建为带有. 该应用程序还使用了一些-related 代码,因此我们还必须对其进行链接。OpenSSLDCMTKMT(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 中的这篇文章。但他们没有帮助我,因为他们都一直说 MFC 库应该在 CRT 之前链接,但我找不到改变链接顺序的方法。

任何帮助是极大的赞赏。

编辑1:使用这个线程的技巧实际上解决了问题,但我仍然想知道这里出了什么问题。

编辑 2:在 Windows 7 和 Qt 4.6.3 上使用 Visual Studio 2008 SP1

4

2 回答 2

4

问题很清楚:您正在一起编译 CRT 和 MFC 代码。

当您使用 MFC 库时,您必须确保在链接 CRT 库之前链接它们。您可以通过确保项目中的每个文件首先直接(#include)或间接(#include)包含 Msdev\Mfc\Include\Afx.h 来做到这一点。Afx.h 包含文件通过使用指令强制库的正确顺序:

#pragma comment (lib,"<libname>")

Microsoft 有一篇文章(链接现已消失,但请查看此处)描述此问题并逐步提出 2 个解决方案(以下步骤基于 Visual C++ 6.0):

解决方案一:强制链接器以正确的顺序链接库

  1. 在项目菜单上,单击设置。
  2. 在“项目设置”对话框的“设置”视图中,单击以选择出现链接错误的项目配置。
  3. 在链接选项卡上,单击以选择类别组合框中的输入。
  4. 在忽略库框中,插入库名称(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:链接器命令行等效于/NOD:<library name>.

  1. 在 Object/library modules (VS2008: Properties->Configuration Properties->Linker->Input->Additional Dependencies)框中,插入库名称。您必须确保它们按顺序列出,并且作为前两个库在行(例如,Nafxcwd.lib Libcmtd.lib)。

解决方案二:定位并更正问题模块

要查看当前库链接顺序,请执行以下步骤:

  1. 在项目菜单上,单击设置。
  2. 在“项目设置”对话框的“设置”视图中,单击以选择出现链接错误的项目配置。
  3. 在链接选项卡上,在项目选项框中键入 /verbose:lib。
  4. 重建你的项目。在链接过程中,库将在输出窗口中列出。
于 2010-08-27T16:25:20.227 回答
0

这是在 MSDN 论坛上向我澄清的:http: //social.msdn.microsoft.com/Forums/en/vcgeneral/thread/4e331cb3-e566-4ca6-b7d4-118c3bebd31a

于 2010-08-29T10:41:46.983 回答