我有一个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文件链接的解释都将受到高度赞赏。
答案 0 :(得分:62)
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)。
答案 1 :(得分:10)
要尝试的一件事是确保你拥有:
#include "stdafx.h"
作为.cpp文件的第一行。我确信在所有情况下都不是答案,但是在我的情况下它会让同样的错误消失。
答案 2 :(得分:5)
答案 3 :(得分:4)
请确保#include <afx.h>
中的"stdafx.h"
#include <string>
之前包括 const navigationOptions = {
header: ({navigate}) => ({
left: (
<TouchableOpacity
activeOpacity={1}
onPress={() => navigate('DrawerOpen')}>
<Image
style={styles.app_drawer}
source={require("../assets/ic_drawer.png")}
/>
</TouchableOpacity>
),
title: (
<Image
style={styles.app_logo}
source={require("../assets/ctw_logo_white.png")}/>
),
style: {backgroundColor: colors.purple},
}),
};
const Stack = {
[strings.route_cases]: {
name: "Cases",
screen: Object.assign(MainScreen, {navigationOptions}),
},
[strings.route_case_details]: {
name: "Case Details",
screen: CaseDetailsScreen,
},
};
答案 4 :(得分:3)
在项目->属性->配置属性->中将Use MFC in a Shared DLL
更改为Use MFC in a Static Library
时,我在Visual Studio 2010的MFC解决方案中遇到了这个问题常规。
我通过以下方式解决了问题,请首先找到项目->属性->配置属性->链接器->输入。
在调试模式下:
uafxcwd.lib;Libcmtd.lib
。uafxcwd.lib;Libcmtd.lib
。在释放模式下:
uafxcw.lib;Libcmt.lib
。uafxcw.lib;Libcmt.lib
。注意:
;
文件之间的.lib
。-d
。答案 5 :(得分:2)
确保您链接的C ++运行时库在静态库和可执行文件中是相同的。检查项目属性C / C ++ - &gt;代码生成 - &gt;运行时库设置。
答案 6 :(得分:2)
错字。你得到的一个愚蠢的方法是包括标题,而不是cpp。 e.g。
#include <myclass.cpp> //should be #include <myClass.h>
答案 7 :(得分:1)
首先,libcmtd.lib用于调试版本,libcmt.lib用于生产。仔细检查您是否包括两者。需要检查的地方是Configuration Properties / Linker项目属性的“命令行”部分。
如果您转到项目的属性,并打开配置属性/链接器/输入部分,您可以“Ingore特定库”...尝试在该字段中列出libcmtd.lib。
答案 8 :(得分:1)
对我来说,我有一个用_CRTDBG_MAP_ALLOC编译的静态库,而且应用程序没有用_CRTDBG_MAP_ALLOC编译,我接收了LNK2005。我已经将应用程序更改为使用_CRTDBG_MAP_ALLOC进行编译,LNK2005消失了。
答案 9 :(得分:1)
摆脱了问题
uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
uafxcw.lib
。uafxcw.lib
。答案 10 :(得分:0)
检查两个项目的清单文件,确保它们链接相同版本的标准库。很可能它们不是,检查属性 - >代码生成 - &gt;标准库链接。
答案 11 :(得分:0)
我也有类似的问题。 Donnie给出的链接解释了原因。解决方案是查看错误消息,然后删除所涉及的库,并首先按照MFC库的顺序添加这些库,然后再添加CRT库。
在vs2008中这样做的方法是由ali给出的。
答案 12 :(得分:0)
声明并定义变量的头文件。可能的方案包括: 在.h中声明变量:extern BOOL MyBool;然后在.c或.cpp文件中分配给它:BOOL MyBool = FALSE;。 声明变量static。 声明变量selectany。
答案 13 :(得分:0)
对我来说,问题是通过改变
来解决的项目 - &gt;属性 - &gt;配置属性 - &gt;一般:使用 MFC =在共享DLL中使用MFC
在设置为&#34;使用标准Windows库&#34;
之前此外,我必须在
下设置/ MD选项项目 - &gt;属性 - &gt; C / C ++ - &gt;代码生成:运行时库= 多线程DLL(/ MD)
答案 14 :(得分:0)
我用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
现在,两个修复程序中的任何一个对我都有效:
Project > Properties > Configuration Properties > General > Use of MFC
将其设置为在共享DLL中使用,这还应该自动将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
其他更改链接器设置的解决方案我尝试过,但是它们不起作用。
如果有人知道我的解决方案为何有效,那很奇怪,为什么在pch.h
中包含这些标头可以解决链接器问题,而在其他任何地方包含相同的标头会触发该错误呢?