链接错误:已经定义(Linker error: already defined)

2019-09-24 04:34发布

我试图编译我的Visual C ++项目(使用MFC)在Microsoft Visual Studio 2012,并将其与以下错误回来:

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这个问题?

Answer 1:

该问题的最可能的原因是具有不同版本的链接的项目的不同部分的C运行时(多个或单个线程,调试 - 或非调试)的。 也许你的主执行程序已经运行一个链接,但要链接到一个不同的运行建立了一个图书馆。 用于depends.exe检查您明确链接又找到了鹤立鸡群每个库。



Answer 2:

我固定的问题:我发现,它与的包括所述次序的问题。 然而强迫每个文件有afx.h包括(属性 - > C / C ++ /高级/力包括文件)解决了这个问题对我来说。



Answer 3:

好吧,我刚刚处理了这个问题,同时与MFC项目结合.c文件(编译单元)。 .c文件有,这是在图书馆我与连接相同的名称(编译单元)。 我改变了文件的名称和链接混乱就走了。

我尝试了上述其他解决方案,其中没有工作。



Answer 4:

我还发现,如果你使用LTGC(链接时代码生成),你刚刚添加了自定义实现了operator new或存在于CRT其他一些符号,那么你应该做一个全面重建 ,最后才增量连接器省略“弱引用”。 这甚至在2015年VS是真实的。



Answer 5:

是你有这个问题与Visual Studio 2008年或2010年?

我看到在Visual Studio 2012年类似的故障:代码,在早期版本的工具链的链接精细现在给人的多个实例error LNK2005: "void * __cdecl operator new(unsigned __int64,void *)" (??2@YAPEAX_KPEAX@Z) already defined 。 不像你,我们不使用MFC。

这不是你的问题的解决方案,当然,但它可能指向微软的编译器或连接器发展的一个回归错误。 如果您可以验证同样的代码在VS2010正常工作,这将有助于证实我的诊断。

(要进行检查,只需从“V110”设置项目属性>配置属性>常规>平台工具,以“V100”为您的解决方案的所有项目,并全部重新生成。假设你已经安装在同一台机器上VS2010,你可以做这一切不留VS2012)。

编辑补充:这个错误已报告给微软的错误#768788 。



文章来源: Linker error: already defined