我正在尝试在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中解决这个问题?
答案 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。