繁体   English   中英

链接器错误:已定义

[英]Linker error: already defined

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

我搜索了很多东西,但总是回到同一页面,如何在Visual Studio 2012中解决此问题?

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

我解决了这个问题:我发现包含顺序有问题。 但是,强制每个文件都具有afx.h包含(属性-> c / c ++ / advanced / force包含文件)对我来说已解决了这个问题。

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

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

我还发现,如果您使用LTGC(链接时代码生成),并且刚刚为operator new或CRT中存在的其他符号添加了自定义实现,则应该进行完全重建 ,然后再进行增量构建链接器省略“弱引用”。 即使在VS 2015中也是如此。

您在Visual Studio 2008或2010中遇到此问题吗?

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

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

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

编辑:此错误已报告给Microsoft,为bug#768788

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM