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

问题描述 投票:31回答:16

我有一个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文件链接的解释都将受到高度赞赏。

c++ visual-studio visual-studio-2005 lnk2005
16个回答
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
投票

摆脱了这个问题

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • 在其他依赖项中放入qazxsw poi。
  • 在Ignore特定put put uafxcw.lib

0
投票

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


0
投票

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

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


0
投票

我还要补充说,如果你已经替换了new / delete操作符(如果是,请执行数组和标量),你可能需要将它们标记为__forceinline,以便obj不会与lib冲突。

例如,我这样做是为了强制对齐分配并遇到同样的麻烦,直到我这样做:

uafxcw.lib

0
投票

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

__forceinline void * operator new(size_t size) { return _aligned_malloc(size, 16); } __forceinline void operator delete(void* ptr) { _aligned_free(ptr); } __forceinline void * operator new [](size_t size) { return _aligned_malloc(size, 16); } __forceinline void operator delete [](void* ptr) { _aligned_free(ptr); }


0
投票

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

项目 - >属性 - >配置属性 - >常规:使用MFC =在共享DLL中使用MFC

在将其设置为“使用标准Windows库”之前

另外,我必须在下面设置/ MD选项

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


0
投票

我用VS2017创建了两个新项目,一个是另一个没工作,所以我比较了差异。一个工作是创建的 https://msdn.microsoft.com/en-us/library/72zdcz6f.aspx 一个不工作的人是用 File > New Project > Visual C++ > MFC/ATL > MFC Application 然后添加MFC。在这两种情况下,我都使用MFC作为静态库。我找到了两个补救措施。但在此之前我们必须添加导入,因为第二个项目没有!

File > New Project > Visual C++ > Windows Desktop > Windows Desktop Wizard

现在,两个修复程序中的任何一个都适用于我:

  1. #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes 将它设置为在共享DLL中使用,这也应该自动将Project > Properties > Configuration Properties > General > Use of MFC设置为C/C++ > Code Generation > Runtime Library,确保它确实这样做。现在尝试编译,对我来说它有效。
  2. 我注意到工作项目在stdafx.h中有一些导入,我在另一个项目中将它们复制到pch.h中,它起作用了。(保持属性不变,所以使用静态lib)。复制的代码是这样的:
Multi-threaded debug dll /MDd

更改链接器设置的其他解决方案我尝试了它们但它们不起作用。 如果有人知道为什么我的解决方案有效,我会很感激,这很奇怪,为什么在#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 中包含那些头文件解决了一个链接器问题,而在其他地方包含那些相同的头部会触发那个错误?


10
投票

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

#include "stdafx.h"

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


5
投票

在配置链接器输入中

  • 在附加的依赖项中放入uafxcw.lib; LIBCMT.lib
  • 在Ignore中,put put put uafxcw.lib; LIBCMT.lib

5
投票

确保你在#include <afx.h>"stdafx.h"之前其他包括像#include <string>


3
投票

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

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

在调试模式下:

  • 在附加依赖项中添加uafxcwd.lib;Libcmtd.lib
  • 在忽略特定默认库中添加uafxcwd.lib;Libcmtd.lib

在发布模式下:

  • 在附加依赖项中添加uafxcw.lib;Libcmt.lib
  • 在忽略特定默认库中添加uafxcw.lib;Libcmt.lib

注意:

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

2
投票

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


2
投票

错字。你得到的一个愚蠢的方法是不包括标题,你包括cpp。例如

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

1
投票

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.