【问题标题】:Linker error: already defined链接器错误:已定义
【发布时间】:2012-10-06 13:44:57
【问题描述】:

我正在尝试在 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 我尝试了解决方案一,但“忽略库”框不存在,对象/库模块框也不存在。对于 Ignore Libraries,我找到了 Ignore specific library,但跳过第五步只会给我 17xx 错误。

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

【问题讨论】:

  • 您是否链接到任何非系统库,例如提升?
  • 我不认为我是。我使用的是 Kintect、MFC 和 Windows。
  • 您是否尝试过更改运行时库?例如在 C/C++-> 使用多线程调试 DLL (/MDd) 生成代码。

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


【解决方案1】:

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

【讨论】:

  • 程序不可编译,如果我理解正确,程序depends.exe只能用于.exe文件。
  • 不,依赖也可以在 DLL 上使用。您是否链接到第三方库?如果是这样,您可能需要尝试选择“多线程 DLL”作为运行时。
  • 我认为我没有使用任何第三方库。我们使用的是 MFC、Kinect、Direct2D 和其他一些 Windows 库。那么我应该从哪个库开始呢?还是我的代码中使用了任何库?
  • 除非您编写 MFC,否则这些库都是第三方的。检查您链接到的每个版本,以及您选择的运行时库。例如,请参阅 @snowdude 对您的问题的评论。
  • Depends.exe 只能用于编译代码(DLL 和 EXE)。它有助于诊断动态链接错误,而不是静态链接错误。
【解决方案2】:

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

【讨论】:

  • 我丢失了此信息的来源(因此 YMMV),但另一种方法是在您的 stdafx.h 文件顶部添加以下行:#pragma comment(linker, "/nodefaultlib:libc.lib")#pragma comment(linker, "/nodefaultlib:libcd.lib")
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 谢谢。这也帮助了我。
    【解决方案5】:

    您是否在使用 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 的情况下完成这一切。)

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

    【讨论】:

    • 首先,回答您的问题:我没有使用 Visual Studio 2008 或 2010,只有 2012。如果我将调试器设置为 Visual Studio 2010,我会得到更多错误:101具体的。在这种情况下,我有一个小突破:如果我将 MFC 的使用设置为共享 DLL 而不是在静态库中它可以工作。此外,我认为问题是在我包含用于创建图像的 d2d1.h 之后开始的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2016-03-09
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多