链接器错误:已定义

时间:2012-10-16 12:44:45

标签: c++ mfc linker visual-studio-2012

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

所以我google了一下,找到了这个页面: http://support.microsoft.com/?scid=kb%3Ben-us%3B148652&x=13&y=8 我尝试了解决方案一,但“忽略库”框不存在,对象/库模块框也是如此。对于忽略库我发现忽略特定库,但跳过第五步只给了我17xx错误。

我google了很多,但总是回到同一页面,我如何在Visual Studio 2012中解决这个问题?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

好的,我刚刚将.c文件(编译单元)与MFC项目结合起来处理了这个问题。 .c文件具有与我链接的库中相同的名称(编译单元)。我更改了文件名,链接器混乱消失了。

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

答案 3 :(得分:1)

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

答案 4 :(得分: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的编译器或链接器开发中的回归错误。如果您可以验证VS2010中相同的代码是否正常工作,则可能会确认我的诊断。

(要检查此项,只需将解决方案中所有项目的项目属性>配置属性>常规>平台工具集从“v110”设置为“v100”,然后重建全部。假设您已安装VS2010同样的机器,你可以在不离开VS2012的情况下完成这一切。)

已编辑添加:此错误已作为bug #768788报告给Microsoft。