Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误LNK2005:LIBCMTD.lib(new.obj)中已定义新建和删除_C++_Visual Studio_Visual Studio 2005_Lnk2005 - Fatal编程技术网

C++ 错误LNK2005:LIBCMTD.lib(new.obj)中已定义新建和删除

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

我有一个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) : 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

对我来说,我有一个用_CRTDBG_MAP_ALLOC编译的静态库,而应用程序没有用_CRTDBG_MAP_ALLOC编译,我当时收到的是LNK2005。我已将应用程序更改为使用_CRTDBG_MAP_ALLOC编译,LNK2005将消失。

我还将补充一点,如果您已替换了新的/删除运算符(如果是,请同时执行数组和标量),则可能需要将它们标记为u forceinline,以便obj不会与库冲突

例如,我这样做是为了强制调整分配,在我这样做之前也遇到了同样的问题:

__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