链接器错误:已定义 我试图在微软Visual Studio 2012中编译我的Visual C++项目(使用MFC),它返回的错误如下: error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) error LNK1169: one or more multiply defined symbols found

链接器错误:已定义 我试图在微软Visual Studio 2012中编译我的Visual C++项目(使用MFC),它返回的错误如下: error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) error LNK1169: one or more multiply defined symbols found,c++,mfc,linker,visual-studio-2012,C++,Mfc,Linker,Visual Studio 2012,所以我在谷歌上搜索了一下,找到了这个页面: 我尝试了解决方案一,但“忽略库”框不存在,对象/库模块框也不存在。对于Ignore库,我发现Ignore-specific库,但是跳过第五步只会给我带来17xx个错误 我在谷歌上搜索了很多次,但总是回到同一个页面,我如何在Visual Studio 2012中修复此问题?问题最可能的原因是针对项目的不同部分链接了不同版本的C运行时(多线程或单线程、调试或非调试)。可能您的主可执行文件链接了一个运行时,但您正在链接到使用不同运行时构建的库。使用depen

所以我在谷歌上搜索了一下,找到了这个页面: 我尝试了解决方案一,但“忽略库”框不存在,对象/库模块框也不存在。对于Ignore库,我发现Ignore-specific库,但是跳过第五步只会给我带来17xx个错误


我在谷歌上搜索了很多次,但总是回到同一个页面,我如何在Visual Studio 2012中修复此问题?

问题最可能的原因是针对项目的不同部分链接了不同版本的C运行时(多线程或单线程、调试或非调试)。可能您的主可执行文件链接了一个运行时,但您正在链接到使用不同运行时构建的库。使用depends.exe依次检查您正在显式链接的每个库,以找出唯一的库。

Visual Studio 2008或2010是否存在此问题

我在Visual Studio 2012中看到了类似的失败:在早期版本的工具链中链接良好的代码现在给出了多个
错误LNK2005的实例:“void*u cdecl操作符new(unsigned u int64,void*)”(??)??2@YAPEAX_KPEAX@Z) 已定义
。与您不同,我们不使用MFC

当然,这不是问题的解决方案,但它可能指向Microsoft编译器或链接器开发中的回归错误。如果您可以验证相同的代码在VS2010中是否正常工作,这将有助于确认我的诊断

(要检查这一点,只需将解决方案中所有项目的项目属性>配置属性>常规>平台工具集从“v110”设置为“v100”,然后全部重新生成。假设在同一台计算机上安装了VS2010,则无需离开VS2012即可完成所有操作。)


编辑以添加:此错误已作为向Microsoft报告。

我修复了此问题:我发现这是包含顺序的问题。但是,强制每个文件都包含afx.h include(properties->c/c++/advanced/force include文件)
为我修复了这个问题。

好的,我只是在将.c文件(编译单元)与MFC项目组合时处理了这个问题。c文件的名称(编译单元)与我链接的库中的名称相同。我更改了文件名,链接器的混乱消失了


我尝试了上面的其他解决方案,但没有一个奏效。

我还发现,如果您使用LTGC(链接时代码生成),并且您刚刚为
操作符new
或CRT中存在的其他符号添加了自定义实现,那么您应该进行完整重建,只有这样增量链接器才会忽略“弱引用”。即使在VS 2015中也是如此。

该程序不可编译,如果我理解正确,程序depends.exe只能用于.exe文件。不,depends也可以用于DLL。您正在链接到第三方库吗?如果是这样,您可能需要尝试选择“多线程DLL”作为运行时。我想我没有使用任何第三方库。我们使用的是MFC、Kinect、Direct2D和其他一些Windows库。那么我应该从哪个图书馆开始呢?或者我的代码中是否使用了任何库?除非您编写MFC,否则这些库都是第三方的。检查链接到的每个版本的版本,以及选择的运行库。例如,请参阅@snowdude对您的问题的评论。Depends.exe只能用于编译代码(DLL和exe)。它有助于诊断动态链接错误,而不是静态链接错误。您是否针对任何非系统库(例如boost)进行链接?我不这么认为。im使用的都是Kintect、MFC和Windows。您是否尝试过更改运行库?e、 g.在C/C++->代码生成中使用多线程调试DLL(/MDd)。首先,回答您的问题:我没有使用Visual Studio 2008或2010,只有2012。如果我将调试器设置为VisualStudio2010调试器,我会得到更多的错误:具体来说是101。在这种情况下,我有一个很小的突破点:如果我将MFC的使用设置为共享DLL,而不是在静态库中,它就会工作。另外,我认为问题是在我加入了d2d1.h之后开始的,我用它来创建图像。我丢失了这个信息的来源(所以是YMMV),但另一种方法是在stdafx.h文件的顶部添加以下行:
#pragma comment(linker,/nodefaultlib:libc.lib”)
#pragma comment(linker,/nodefaultlib:libcd.lib)谢谢。这也帮助了我。