错误LNK2005:已在LIBCMTD.lib中定义的new和delete(new.obj)

时间:2009-07-18 00:52:59

标签: c++ visual-studio visual-studio-2005 lnk2005

我有一个Visual Studio 2005解决方案,它有两个项目。一个是静态库,另一个是用于测试静态库中的功能的可执行文件。静态库使用MFC。我构建解决方案时遇到以下错误。

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??    3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)

我不知道如何克服这一点。有人可以解释为什么会出现这个错误。任何给出概述.lib文件链接的解释都将受到高度赞赏。

15 个答案:

答案 0 :(得分:62)

CRT库对新的,删除和DllMain函数使用弱外部链接。 MFC库还包含new,delete和DllMain函数。这些函数需要在链接CRT库之前链接MFC库。 http://support.microsoft.com/kb/148652

基于VS2005的解决方案(将Nafxcwd.lib替换为Uafxcwd.lib,用于~VS2013)

转到项目>属性>配置属性>链接器>输入

添加到“附加依赖项” - > Nafxcwd.lib Libcmtd.lib

添加到“忽略特定库” - > Nafxcwd.lib; Libcmtd.lib

库的顺序很重要(Nafxcwd.lib; Libcmtd.lib)。

答案 1 :(得分:10)

要尝试的一件事是确保你拥有:

#include "stdafx.h"

作为.cpp文件的第一行。我确信在所有情况下都不是答案,但是在我的情况下它会让同样的错误消失。

答案 2 :(得分:5)

配置链接器输入中的

  • 在其他依赖项中 uafxcw.lib; LIBCMT.lib
  • 忽略特定的put put uafxcw.lib; LIBCMT.lib

答案 3 :(得分:4)

请确保#include <afx.h>中的"stdafx.h" #include <string>之前包括 const navigationOptions = { header: ({navigate}) => ({ left: ( <TouchableOpacity activeOpacity={1} onPress={() => navigate('DrawerOpen')}> <Image style={styles.app_drawer} source={require("../assets/ic_drawer.png")} /> </TouchableOpacity> ), title: ( <Image style={styles.app_logo} source={require("../assets/ctw_logo_white.png")}/> ), style: {backgroundColor: colors.purple}, }), }; const Stack = { [strings.route_cases]: { name: "Cases", screen: Object.assign(MainScreen, {navigationOptions}), }, [strings.route_case_details]: { name: "Case Details", screen: CaseDetailsScreen, }, };

等其他内容

答案 4 :(得分:3)

项目->属性->配置属性->中将Use MFC in a Shared DLL更改为Use MFC in a Static Library时,我在Visual Studio 2010的MFC解决方案中遇到了这个问题常规。

我通过以下方式解决了问题,请首先找到项目->属性->配置属性->链接器->输入

在调试模式下:

  • 其他依赖项中添加uafxcwd.lib;Libcmtd.lib
  • 忽略特定的默认库中添加uafxcwd.lib;Libcmtd.lib

在释放模式下:

  • 其他依赖项中添加uafxcw.lib;Libcmt.lib
  • 忽略特定的默认库中添加uafxcw.lib;Libcmt.lib

注意:

  1. 不要错过两个;文件之间的.lib
  2. 在调试模式下,必须在文件中添加后缀-d

答案 5 :(得分:2)

确保您链接的C ++运行时库在静态库和可执行文件中是相同的。检查项目属性C / C ++ - &gt;代码生成 - &gt;运行时库设置。

答案 6 :(得分:2)

错字。你得到的一个愚蠢的方法是包括标题,而不是cpp。 e.g。

#include <myclass.cpp> //should be #include <myClass.h>

答案 7 :(得分:1)

首先,libcmtd.lib用于调试版本,libcmt.lib用于生产。仔细检查您是否包括两者。需要检查的地方是Configuration Properties / Linker项目属性的“命令行”部分。

如果您转到项目的属性,并打开配置属性/链接器/输入部分,您可以“Ingore特定库”...尝试在该字段中列出libcmtd.lib。

答案 8 :(得分:1)

对我来说,我有一个用_CRTDBG_MAP_ALLOC编译的静态库,而且应用程序没有用_CRTDBG_MAP_ALLOC编译,我接收了LNK2005。我已经将应用程序更改为使用_CRTDBG_MAP_ALLOC进行编译,LNK2005消失了。

答案 9 :(得分:1)

摆脱了问题

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • 在其他依赖项中放置uafxcw.lib
  • 忽略特定的put put uafxcw.lib

答案 10 :(得分:0)

检查两个项目的清单文件,确保它们链接相同版本的标准库。很可能它们不是,检查属性 - >代码生成 - &gt;标准库链接。

答案 11 :(得分:0)

我也有类似的问题。 Donnie给出的链接解释了原因。解决方案是查看错误消息,然后删除所涉及的库,并首先按照MFC库的顺序添加这些库,然后再添加CRT库。

在vs2008中这样做的方法是由ali给出的。

答案 12 :(得分:0)

声明并定义变量的头文件。可能的方案包括: 在.h中声明变量:extern BOOL MyBool;然后在.c或.cpp文件中分配给它:BOOL MyBool = FALSE;。 声明变量static。 声明变量selectany。

https://msdn.microsoft.com/en-us/library/72zdcz6f.aspx

答案 13 :(得分:0)

对我来说,问题是通过改变

来解决的
  

项目 - &gt;属性 - &gt;配置属性 - &gt;一般:使用   MFC =在共享DLL中使用MFC

在设置为&#34;使用标准Windows库&#34;

之前

此外,我必须在

下设置/ MD选项
  

项目 - &gt;属性 - &gt; C / C ++ - &gt;代码生成:运行时库=   多线程DLL(/ MD)

答案 14 :(得分:0)

我用VS2017创建了两个新项目,一个没有工作,另一个没有工作,所以我比较了区别。一个可用的是使用
File > New Project > Visual C++ > MFC/ATL > MFC Application
创建的,一个不可用的是使用
File > New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard
创建的,然后添加MFC。在这两种情况下,我都使用MFC作为静态库。我已经找到了两个解决方案。但是在此之前,我们必须添加导入,因为第二个项目没有任何内容!

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes

现在,两个修复程序中的任何一个对我都有效:

  1. Project > Properties > Configuration Properties > General > Use of MFC将其设置为在共享DLL中使用,这还应该自动将C/C++ > Code Generation > Runtime Library设置为Multi-threaded debug dll /MDd,以确保确实做到了这一点。 现在尝试编译,对我来说它起作用了。
  2. 我注意到工作项目在stdafx.h中有一些导入,我将它们复制到另一个项目中的pch.h中,它起作用了(保持属性不变,因此使用了静态lib)。复制的代码是这样的:
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit

// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions


#include <afxdisp.h>        // MFC Automation classes

其他更改链接器设置的解决方案我尝试过,但是它们不起作用。
如果有人知道我的解决方案为何有效,那很奇怪,为什么在pch.h中包含这些标头可以解决链接器问题,而在其他任何地方包含相同的标头会触发该错误呢?