链接器错误:已定义

4

我正在尝试在Microsoft 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

我在谷歌上搜索了一下,找到了这个页面: http://support.microsoft.com/?scid=kb%3Ben-us%3B148652&x=13&y=8 我尝试了解决方案一,但是“忽略库”框不存在,对象/库模块框也是如此。对于忽略库,我找到了忽略特定库,但是跳过第五步只给了我17xx错误。
我在谷歌上搜索了很多,但总是回到同一个页面,我该如何在Visual Studio 2012中解决这个问题?

你是否链接了任何非系统库,例如boost? - snowdude
我不认为我是。我只使用Kintect、MFC和Windows。 - Cheiron
你尝试过更改运行库吗?例如在C/C++ -> 代码生成中使用多线程调试DLL(/MDd)。 - snowdude
5个回答

3
我解决了这个问题:我发现这是一个包含顺序的问题。但是,强制每个文件都包含afx.h(属性→c / c ++ /高级/强制包含文件)对我来说解决了这个问题。

1
我丢失了这些信息的来源(所以可能会有所不同),但另一种方法是在您的stdafx.h文件顶部添加以下行:#pragma comment(linker, "/nodefaultlib:libc.lib")``#pragma comment(linker, "/nodefaultlib:libcd.lib") - Qwertie

2

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


2

问题最可能的原因是项目不同部分链接了不同版本的C运行时(多线程或单线程,调试或非调试)。也许你的主可执行文件链接了一个运行时,但你正在链接一个使用不同运行时构建的库。使用depends.exe逐个检查你明确链接的每个库,以找到其中的异常。


1
该程序无法编译,如果我理解正确,程序 depends.exe 只能用于 .exe 文件。 - Cheiron
不是的,depends 也可以用于 DLL。你是否链接到第三方库?如果是这样,你可能需要尝试选择“多线程 DLL”作为运行时。 - RobH
我不认为我在使用任何第三方库。我们正在使用的是MFC、Kinect、Direct2D和其他一些Windows库。那么我应该从哪个库开始呢?或者说,我的代码中使用的任何库都可以吗? - Cheiron
除非你编写了MFC,否则这些库都是第三方的。检查你链接的每个版本,以及你选择的运行时库。例如,请参考@snowdude在你的问题下的评论。 - RobH
Depends.exe 只能用于已经编译好的代码(DLL 和 EXE)。它有助于诊断动态链接错误,而不是静态链接错误。 - Qwertie

1

好的,我刚刚在将一个.c文件(编译单元)与一个MFC项目合并时遇到了这个问题。.c文件与我链接的库中的名称(编译单元)相同。我更改了文件名,链接器的混淆问题消失了。

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


谢谢。这也帮了我很多。 - rrirower

0

你是在使用 Visual Studio 2008 还是 2010 时遇到了这个问题?

我在 Visual Studio 2012 中看到了一个类似的失败:之前版本的工具链中链接良好的代码现在出现了多个 error LNK2005: "void * __cdecl operator new(unsigned __int64,void *)" (??2@YAPEAX_KPEAX@Z) already defined 实例。与你不同,我们没有使用 MFC。

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

(要检查这一点,只需将项目属性 > 配置属性 > 常规 > 平台工具集从“v110”更改为“v100” ,并重新生成所有项目。假设你在同一台机器上安装了 VS2010,你可以在不离开 VS2012 的情况下完成所有操作。)

编辑以补充:此错误已报告给微软作为 bug #768788


1
首先,回答你的问题:我没有使用Visual Studio 2008或2010,只有2012。如果我将调试器设置为Visual Studio 2010,则会出现更多错误:具体来说是101个。在这种情况下,我有一个小突破:如果我将MFC的使用设置为共享DLL而不是静态库,它就可以工作了。此外,我认为问题始于我包含d2d1.h,我用它来创建图像。 - Cheiron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接