C++ 错误LNK2005:LIBCMTD.lib(new.obj)中已定义新建和删除
我有一个VisualStudio2005解决方案,它有两个项目。一个是静态库,另一个是用于测试静态库中的功能的可执行文件。静态库使用MFC。在构建解决方案时,我遇到了以下错误C++ 错误LNK2005:LIBCMTD.lib(new.obj)中已定义新建和删除,c++,visual-studio,visual-studio-2005,lnk2005,C++,Visual Studio,Visual Studio 2005,Lnk2005,我有一个VisualStudio2005解决方案,它有两个项目。一个是静态库,另一个是用于测试静态库中的功能的可执行文件。静态库使用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
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++运行时库与静态库以及可执行文件相同。检查项目属性C/C++->代码生成->运行时库设置。
首先,libcmtd.lib用于调试版本,libcmt.lib用于生产。仔细检查,确认你没有同时包括这两项。要检查的一个地方是配置属性/链接器项目属性的“命令行”部分如果您转到项目的属性,并打开配置属性/链接器/输入部分,您可以“Ingore Specific Library”…尝试在该字段中列出libcmtd.lib。CRT库对new、delete和DllMain函数使用弱外部链接。MFC库还包含new、delete和DllMain函数。这些函数要求在链接CRT库之前先链接MFC库。 基于VS2005的解决方案(将~VS2013的Nafxcwd.lib替换为Uafxcwd.lib) 转到项目>属性>配置属性>链接器>输入 添加到“附加依赖项”->Nafxcwd.Libcmtd.lib 添加到“忽略特定库”->Nafxcwd.lib;Libcmtd.lib
库的顺序很重要(Nafxcwd.lib;Libcmtd.lib)。要尝试的一件事是确保您有:
#include "stdafx.h"
作为.cpp文件中的第一行。我确信这不是所有情况下的答案,但在我的情况下,它消除了相同的错误。打字错误。一个愚蠢的方法是不包括标题,而是包含cpp。 e、 g
#include//应该是#include
我也有类似的问题。Donnie给出的链接解释了原因。解决方案是查看错误消息,然后删除那些涉及的lib,然后按照MFC libs和CRT libs的顺序添加这些lib
阿里给出了在vs2008中实现这一点的方法 在配置链接器输入中
- 在其他依赖项中,putuafxcw.lib;LIBCMT.lib
- 在忽略特定put putuafxcw.lib中;LIBCMT.lib
__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);
}
解决了这个问题
uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
- 在其他依赖项中放入
uafxcw.lib
- 在忽略特定put put
中uafxcw.lib
“stdafx.h”
中声明并定义了一个变量的头文件,然后在其他包含文件(如#include
)中包含。可能的解决办法包括:
在.h中声明变量:extern BOOL MyBool;然后在.c或.cpp文件中分配给它:BOOL MyBool=FALSE;。
将变量声明为static。
声明变量selectany
对我来说,问题是通过改变
项目->属性->配置属性->常规:使用
MFC=在共享DLL中使用MFC
在设置为“使用标准Windows库”之前
此外,我必须在下面设置/MD选项
项目->属性->C/C++->代码生成:运行时库=
多线程DLL(/MD)
我在Visual Studio 2010的MFC解决方案中遇到了这个问题,在项目->属性->配置属性->常规中,将共享DLL中的使用MFC更改为静态库中的使用MFC
我通过以下方法解决问题,请先定位项目->属性->配置属性->链接器->输入
在调试模式下:
- 添加
uafxcwd.lib;Libcmtd.lib
在其他依赖项中
- 添加
uafxcwd.lib;Libcmtd.lib
在中忽略特定的默认库
在释放模式下:
- 添加
uafxcw.lib;Libcmt.lib
在附加依赖项中
- 添加
uafxcw.lib;Libcmt.lib
在中忽略特定的默认库
注意:
不要错过代码>在两个.lib
文件之间
在调试模式下,必须在文件中添加后缀-d
我用VS2017创建了两个新项目,一个正在工作,另一个没有,所以我比较了两者的区别。一个工作是用
文件>新项目> Visual C++ > MFC/ATL> MFC应用程序< /COD> < BR> >,用BR/>代码>文件>新建项目> Visual C++ > Windows桌面> Windows桌面向导> /Cub> BR/>然后添加MFC。在这两种情况下,我都使用MFC作为静态库。我想出了两个解决办法。但在此之前,我们必须添加导入,因为第二个项目没有导入
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
其他更改链接器设置的解决方案我尝试过,但都不起作用。
我会的
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes