【问题标题】:error LNK2005: new and delete already defined in LIBCMTD.lib(new.obj)错误 LNK2005:在 LIBCMTD.lib(new.obj) 中已经定义了新的和删除的
【发布时间】:2010-11-11 21:25:32
【问题描述】:

我有一个包含两个项目的 Visual Studio 2005 解决方案。一个是静态库,另一个是用于测试静态库中功能的可执行文件。静态库使用 MFC。构建解决方案时出现以下错误。

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??    3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)

我不知道如何克服这一点。有人可以解释为什么会发生此错误。任何提供 .lib 文件链接概述的解释都将受到高度赞赏。

【问题讨论】:

  • 另一个(非静态库)项目是 CRT 项目吗?
  • 如果其他(非静态库)项目是 CRT 项目,请查看此链接:support.microsoft.com/kb/148652
  • 我在尝试使用 cl 从命令行编译控制台应用程序时遇到此错误。直到我 #included 我的一个使用 MFC 的 CString 的库时,我才拥有它。感谢知识库文章,我刚刚将我的#include 向上移动并解决了问题。

标签: c++ visual-studio visual-studio-2005 lnk2005


【解决方案1】:

检查两个项目的清单文件,确保它们链接的标准库版本相同。很可能不是,检查属性->代码生成->标准库链接。

【讨论】:

    【解决方案2】:

    确保您要链接的 C++ 运行时库在您的静态库和可执行文件上是相同的。检查您的项目属性 C/C++->代码生成->运行时库设置。

    【讨论】:

      【解决方案3】:

      首先,libcmtd.lib 用于调试版本,libcmt.lib 用于生产。仔细检查您是否同时包含两者。要检查的地方之一是配置属性/链接器项目属性的“命令行”部分。

      如果您转到项目的属性,并打开配置属性/链接器/输入部分,您可以“Ingore 特定库”...尝试在该字段中列出 libcmtd.lib。

      【讨论】:

        【解决方案4】:

        CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。 MFC 库还包含 new、delete 和 DllMain 函数。这些函数需要在链接 CRT 库之前链接 MFC 库。 http://support.microsoft.com/kb/148652

        基于VS2005的解决方案(~VS2013用Uafxcwd.lib替换Nafxcwd.lib)

        转到项目>属性>配置属性>链接器>输入

        添加到“附加依赖项”-> Nafxcwd.lib Libcmtd.lib

        添加到“忽略特定库”-> Nafxcwd.lib;Libcmtd.lib

        库的顺序很重要(Nafxcwd.lib;Libcmtd.lib)。

        【讨论】:

        • 如果您使用 unicode 进行编译,您希望使用 uafxcwd.lib 而不是 nafxcwd.lib。请注意, d 也仅用于调试版本。在你的发布配置中使用 uafxcw.lib 和 libcmt.lib
        • 我按照建议将它们放在额外​​的依赖项中(在我拥有的任何其他内容之前),但不需要将它们放在“忽略特定库”中。对于任何正在寻找的人,这是this knowledge base article 的第 2 步建议的“如何解决依赖问题”,经常链接到此类问题。
        • @grim,这救了我的命。
        • 很好的答案!
        【解决方案5】:

        要尝试的一件事是确保您拥有:

        #include "stdafx.h"
        

        作为 .cpp 文件的第一行。我确信这不是所有情况下的答案,但在我的情况下它使相同的错误消失了。

        【讨论】:

        • 我不知道我是不是要疯了,但是在其他选项无效后,我尝试了您的答案。错误消失了。然后我删除了该行以记录错误的确切性质......他们没有回来?!嗯 c++ 编译器错误至少可以说是神秘的......
        • 我独立得出了同样的结论。
        • 是的,这对我也有用。我怀疑这是由于 stdafx.h 包含的内容。我想知道从所有文件中删除 stdafx.h 包含和删除 stdafx.cpp 是否会产生相同的效果?
        【解决方案6】:

        错字。你得到的一种愚蠢的方法是不包含标题,而是包含 cpp。 例如

        #include <myclass.cpp> //should be #include <myClass.h>
        

        【讨论】:

        • 正确。这发生在我的案例中。我将所有函数和类定义保留在 cpp 中,并收到此错误。当我将定义转移到 hpp 文件时,错误就消失了。奇怪!
        【解决方案7】:

        我也有类似的问题。 Donnie 给出的链接解释了原因。解决方案是查看错误消息,然后删除涉及的那些库,并按照 MFC 库和 CRT 库的顺序添加这些库。

        在vs2008中实现的方法是ali给出的。

        【讨论】:

          【解决方案8】:

          在配置链接器输入中

          • 在附加依赖项中放入 uafxcw.lib;LIBCMT.lib
          • 在忽略特定放置放置 uafxcw.lib;LIBCMT.lib

          【讨论】:

            【解决方案9】:

            对我来说,我有一个用 _CRTDBG_MAP_ALLOC 编译的静态库,而应用程序不是用 _CRTDBG_MAP_ALLOC 编译的,当时我收到的是 LNK2005。我已将应用程序更改为使用 _CRTDBG_MAP_ALLOC 编译,LNK2005 消失了。

            【讨论】:

              【解决方案10】:

              我还要补充一点,如果你已经替换了 new/delete 运算符(如果是这样,请同时做数组和标量),你可能需要将它们标记为 __forceinline 以便 obj 不会与库。

              例如,我这样做是为了强制对齐分配,但在我这样做之前遇到了同样的问题:

              __forceinline void * operator new(size_t size)
              {
                  return _aligned_malloc(size, 16);
              }
              __forceinline void operator delete(void* ptr)
              {
                  _aligned_free(ptr);
              }
              __forceinline void * operator new [](size_t size)
              {
                  return _aligned_malloc(size, 16);
              }
              __forceinline void operator delete [](void* ptr)
              {
                  _aligned_free(ptr);
              }
              

              【讨论】:

              • 我相信inline 就足够了。毕竟,你并不关心这些调用是否被内联。您只需要能够拥有多个定义(在不同的翻译单元中),这就是 inline 为您提供的。
              【解决方案11】:

              解决问题

              uafxcwd.lib(afxmem.obj) : warning LNK4006: "void * __cdecl operator new(unsigned __int64)"
              
              • 在其他依赖项中添加uafxcw.lib
              • In Ignore specific put put uafxcw.lib.

              【讨论】:

                【解决方案12】:

                确保在"stdafx.h" 中包含#include &lt;afx.h&gt;,然后再包含#include &lt;string&gt; 等其他内容

                【讨论】:

                  【解决方案13】:

                  声明并定义变量的头文件。可能的解决方案包括: 在 .h 中声明变量: extern BOOL MyBool;然后在 .c 或 .cpp 文件中分配给它:BOOL MyBool = FALSE;。 声明变量静态。 声明变量 selectany。

                  https://msdn.microsoft.com/en-us/library/72zdcz6f.aspx

                  【讨论】:

                    【解决方案14】:

                    对我来说,问题是通过改变解决的

                    项目 -> 属性 -> 配置属性 -> 常规:使用 MFC = 在共享 DLL 中使用 MFC

                    在设置为“使用标准 Windows 库”之前

                    另外我必须在下面设置 /MD 选项

                    项目 -> 属性 -> C/C++ -> 代码生成:运行时库 = 多线程 DLL (/MD)

                    【讨论】:

                      【解决方案15】:

                      我在 Visual Studio 2010 的 MFC 解决方案中遇到了这个问题,同时在 Project -> Properties -> Configuration Properties -> General 中将 Use MFC in a Shared DLL 更改为 Use MFC in a Static Library >。

                      我通过以下方式解决问题,请先定位到Project -> Properties -> Configuration Properties -> Linker -> Input

                      在调试模式下:

                      • 其他依赖项中添加uafxcwd.lib;Libcmtd.lib
                      • 忽略特定默认库中添加uafxcwd.lib;Libcmtd.lib

                      在发布模式下:

                      • 其他依赖项中添加uafxcw.lib;Libcmt.lib
                      • 忽略特定默认库中添加uafxcw.lib;Libcmt.lib

                      注意:

                      1. 不要错过两个.lib 文件之间的;
                      2. 必须在Debug模式的文件中添加后缀-d

                      【讨论】:

                        【解决方案16】:

                        我用 VS2017 创建了两个新项目,一个正在工作,另一个没有,所以我比较了有什么不同。一个工作是用
                        File &gt; New Project &gt; Visual C++ &gt; MFC/ATL &gt; MFC Application
                        创建的,一个不工作是用
                        File &gt; New Project &gt; Visual C++ &gt; Windows Desktop &gt; Windows Desktop Wizard
                        然后添加 MFC 创建的。在这两种情况下,我都使用 MFC 作为静态库。我想出了两个修复方法。但在此之前我们必须添加导入,因为第二个项目没有!

                        #include <afxwin.h>         // MFC core and standard components
                        #include <afxext.h>         // MFC extensions
                        #include <afxdisp.h>        // MFC Automation classes
                        

                        现在这两个修复中的任何一个都对我有用:

                        1. Project &gt; Properties &gt; Configuration Properties &gt; General &gt; Use of MFC 将其设置为在共享 DLL 中使用,这也应该自动将 C/C++ &gt; Code Generation &gt; Runtime Library 设置为 Multi-threaded debug dll /MDd 确保它确实做到了。 现在尝试编译,对我来说它成功了。
                        2. 我注意到工作项目在 stdafx.h 中有一些导入,我将它们复制到另一个项目的 pch.h 中,它起作用了。(保持属性不变,因此使用了静态库)。复制的代码是这样的:
                        #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit
                        
                        // turns off MFC's hiding of some common and often safely ignored warning messages
                        #define _AFX_ALL_WARNINGS
                        #include <afxwin.h>         // MFC core and standard components
                        #include <afxext.h>         // MFC extensions
                        
                        
                        #include <afxdisp.h>        // MFC Automation classes
                        

                        更改链接器设置的其他解决方案我试过了,但没有奏效。
                        如果有人知道我的解决方案为什么有效,我将不胜感激,这很奇怪,为什么在 pch.h 中包含这些标头可以解决链接器问题,而在其他任何地方包含相同的标头会触发该错误??

                        【讨论】:

                        • pch.h 文件作为预编译头文件生成。您可以使用 Properties -> C/C++ -> Precompiled Headers 并选择“Not using precompiled headers”为项目关闭它们。您还可以通过右键单击解决方案资源管理器中的文件并浏览属性菜单来禁用单个 C/C++ 文件的预编译头文件。
                        【解决方案17】:

                        我在搜索此答案时遇到的另一个可能原因:

                        我不小心在 .cpp 文件的顶部留下了 #include "StdAfx.h" 行,我将它从应用程序(使用预编译头文件)移动到共享静态库(不使用预编译头文件)中。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2012-04-25
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-12-21
                          • 2015-08-10
                          • 2010-10-11
                          相关资源
                          最近更新 更多