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

33 c++ visual-studio-2005 lnk2005 visual-studio

我有一个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)
Run Code Online (Sandbox Code Playgroud)

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

小智 65

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).

  • 如果您使用unicode进行编译,则需要使用uafxcwd.lib而不是nafxcwd.lib.请注意,d仅适用于调试版本.在您的发布配置中,使用uafxcw.lib和libcmt.lib (18认同)
  • @grim,这拯救了我的生命. (2认同)

And*_*ens 11

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

#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

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


小智 5

在配置链接器输入中

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


use*_*593 5

请确保您有#include <afx.h>"stdafx.h"之前其他包括像#include <string>


Cip*_*Saw 5

我在Visual Studio 2010的MFC解决方案中遇到了这个问题,同时在Project-> Properties-> Configuration Properties-> General中更改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必须在调试模式下在文件中添加后缀。


Deu*_*uro 0

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