我有一个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文件链接的解释都将受到高度赞赏。
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)。
摆脱了这个问题
uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
uafxcw.lib
。检查两个项目的清单文件,确保它们链接相同版本的标准库。最有可能的不是,检查属性 - >代码生成 - >标准库链接。
我也有类似的问题。 Donnie给出的链接解释了原因。解决方案是查看错误消息,然后删除所涉及的库,并首先按照MFC库的顺序添加这些库,然后再添加CRT库。
在vs2008中这样做的方法是由ali给出的。
我还要补充说,如果你已经替换了new / delete操作符(如果是,请执行数组和标量),你可能需要将它们标记为__forceinline,以便obj不会与lib冲突。
例如,我这样做是为了强制对齐分配并遇到同样的麻烦,直到我这样做:
uafxcw.lib
头文件声明并定义了一个变量。可能的解决方案包括:在.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);
}
对我来说,问题是通过改变来解决的
项目 - >属性 - >配置属性 - >常规:使用MFC =在共享DLL中使用MFC
在将其设置为“使用标准Windows库”之前
另外,我必须在下面设置/ MD选项
项目 - >属性 - > C / C ++ - >代码生成:运行时库=多线程DLL(/ MD)
我用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
现在,两个修复程序中的任何一个都适用于我:
#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
,确保它确实这样做。现在尝试编译,对我来说它有效。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
中包含那些头文件解决了一个链接器问题,而在其他地方包含那些相同的头部会触发那个错误?
要尝试的一件事是确保你有:
#include "stdafx.h"
作为.cpp文件的第一行。我确信在所有情况下都不是答案,但在我的情况下,它会让同样的错误消失。
在配置链接器输入中
确保你在#include <afx.h>
有"stdafx.h"
之前其他包括像#include <string>
我在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
。注意:
;
文件之间的.lib
。-d
。确保您链接的C ++运行时库在静态库和可执行文件中是相同的。检查项目属性C / C ++ - >代码生成 - >运行时库设置。
错字。你得到的一个愚蠢的方法是不包括标题,你包括cpp。例如
#include <myclass.cpp> //should be #include <myClass.h>
首先,libcmtd.lib用于调试版本,libcmt.lib用于生产。仔细检查您是否包括两者。要检查的一个地方是Configuration Properties / Linker项目属性的“命令行”部分。
如果您转到项目的属性,并打开配置属性/链接器/输入部分,您可以“Ingore特定库”...尝试在该字段中列出libcmtd.lib。
对我来说,我有一个用_CRTDBG_MAP_ALLOC编译的静态库,而且应用程序没有用_CRTDBG_MAP_ALLOC编译,我接收了LNK2005。我已经将应用程序更改为使用_CRTDBG_MAP_ALLOC进行编译,LNK2005消失了。