43

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

4

18 回答 18

75

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

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

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

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

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

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

于 2009-11-16T10:50:33.247 回答
16

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

#include "stdafx.h"

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

于 2011-10-06T04:12:34.143 回答
11

我在 Visual Studio 2010 的 MFC 解决方案中遇到了这个问题,同时更改Use MFC in a Shared DLLProject -> Properties -> Configuration Properties -> GeneralUse 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必须在调试模式下的文件中添加后缀。
于 2018-11-09T08:53:17.457 回答
7

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

于 2017-06-20T11:35:03.523 回答
5

在配置链接器输入中

  • 在其他依赖项中放置uafxcw.lib;LIBCMT.lib
  • 在 Ignore specific put put uafxcw.lib;LIBCMT.lib
于 2014-03-18T09:36:40.197 回答
3

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

于 2009-07-18T00:59:37.577 回答
2

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

#include <myclass.cpp> //should be #include <myClass.h>
于 2012-04-27T15:49:36.627 回答
1

首先,libcmtd.lib 用于调试版本,libcmt.lib 用于生产。仔细检查您是否同时包含两者。要检查的地方之一是配置属性/链接器项目属性的“命令行”部分。

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

于 2009-07-18T01:04:50.510 回答
1

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

于 2015-03-03T15:02:46.690 回答
1

我用 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 LibraryMulti-threaded debug dll /MDd确保它确实做到了。现在尝试编译,对我来说它有效。
  2. 我注意到工作项目在 stdafx.h 中有一些导入,我将它们复制到另一个项目的 pch.h 中,它起作用了。(保持属性不变,因此使用了静态库)。复制的代码是这样的:
#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可以解决链接器问题,而在其他任何地方包含相同的标头会触发该错误?

于 2019-04-28T10:13:03.307 回答
1

摆脱了问题

uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
  • 在附加依赖项中放置uafxcw.lib
  • 在忽略特定 put put uafxcw.lib
于 2017-04-07T17:59:06.617 回答
0

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

于 2009-07-18T00:59:25.737 回答
0

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

在vs2008中做到这一点的方法是由阿里给出的。

于 2013-05-10T15:50:29.897 回答
0

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

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

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

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

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

于 2017-08-31T07:21:35.157 回答
0

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

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

于 2017-07-05T07:08:49.540 回答
0

将 Cipher Saw 的解决方案应用于 vs2015 后出现错误

1>afxnmcdd.lib(wincore2.obj) : error LNK2005: "void __stdcall DDX_Control(class CDataExchange *,int,class CWnd &)" (?DDX_Control@@YGXPAVCDataExchange@@HAAVCWnd@@@Z) already defined in uafxcwd.lib(wincore2.obj)
1>afxnmcdd.lib(wincore2.obj) : error LNK2005: "public: int __thiscall CWnd::ExecuteDlgInit(void *)" (?ExecuteDlgInit@CWnd@@QAEHPAX@Z) already defined in uafxcwd.lib(wincore2.obj)
1>afxnmcdd.lib(wincore2.obj) : error LNK2005: "public: void __thiscall CMFCDynamicLayout::GetHostWndRect(class CRect &)const " (?GetHostWndRect@CMFCDynamicLayout@@QBEXAAVCRect@@@Z) already defined in uafxcwd.lib(wincore2.obj)
1>afxnmcdd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" (?AfxRegisterMFCCtrlClasses@@YAXXZ) already defined in uafxcwd.lib(afxctrlcontainer2.obj)
1>afxnmcdd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" (?PreUnsubclassControl@CMFCControlContainer@@IAEXPAVCWnd@@@Z) already defined in uafxcwd.lib(afxctrlcontainer2.obj)
1>afxnmcdd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" (?SubclassDlgControls@CMFCControlContainer@@QAEHXZ) already defined in uafxcwd.lib(afxctrlcontainer2.obj)

能够通过将库列表从更改uafxcw.lib;Libcmt.libafxnmcdd.lib;uafxcwd.lib;Libcmtd.lib(调试 unicode 构建)来修复它们

于 2022-02-14T10:33:47.707 回答
0

我还要补充一点,如果您已经替换了 new/delete 运算符(如果是这样,请同时执行数组和标量),您可能需要将它们标记为 __forceinline 以便 obj 不会与 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);
}
于 2015-08-15T00:49:29.530 回答
0

我在搜索此答案时遇到的另一个可能原因:

我不小心在 .cpp 文件的顶部留下了#include "StdAfx.h"一行,该文件从应用程序(使用预编译头文件)移动到共享静态库(不使用预编译头文件)中。

于 2021-08-13T16:28:31.150 回答