Visual Studio链接错误。包含MFC,CRT的订单?

时间:2010-08-27 16:21:00

标签: visual-studio mfc linker-errors crt

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

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

该应用取决于QtzlibOpenSSLDCMTK。所有这些库都构建为具有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

这是linker output

我在许多网站上阅读了很多线程以及MSDN的KB中的article。但他们并没有帮助我,因为所有人都说在MCR之前应该链接MFC库,但我找不到改变链接顺序的方法。

非常感谢任何帮助。

修改1 : 使用来自this thread的技巧实际上解决了这个问题,但我仍然想知道这里有什么问题。

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

2 个答案:

答案 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 ):

  

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

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

    注意/NOD:<library name>中的链接器命令行等效项。

         
        
    1. 在对象/库模块(VS2008:属性 - >配置属性 - >链接器 - >输入 - >附加依赖关系)框中,插入库名称。您必须确保这些按顺序列出并作为行中的前两个库(例如,Nafxcwd.lib Libcmtd.lib)。
    2.         

      解决方案二:找到并纠正问题模块

           

      要查看当前库链接顺序,请按以下步骤操作:

           
          
      1. 在“项目”菜单上,单击“设置”。
      2.   
      3. 在“项目设置”对话框的“设置”视图中,单击以选择导致链接错误的项目配置。
      4.   
      5. 在“链接”选项卡上,在“项目选项”框中键入/ verbose:lib。
      6.   
      7. 重建您的项目。在链接过程中,库将在输出窗口中列出。
      8.   

答案 1 :(得分:0)