【问题标题】:error LNK2005: _DllMain@12 already defined in MSVCRT.lib错误 LNK2005:_DllMain@12 已在 MSVCRT.lib 中定义
【发布时间】:2010-09-25 11:53:05
【问题描述】:

我收到此链接器错误。

mfcs80.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已在 MSVCRT.lib(dllmain.obj) 中定义

请告诉我消除此错误的正确方法。我在 microsoft 支持网站上阅读了有关此错误的解决方案,但没有太大帮助。

我正在使用带有 Platform SDK 的 VS 2005

【问题讨论】:

    标签: c++ visual-c++ linker


    【解决方案1】:

    我收到了同样的错误信息,但这里的答案都没有为我解决。 因此,如果您在创建使用 MFC 的 DLL 项目时遇到该问题,可以通过输入以下行来解决:

    extern "C" { int _afxForceUSRDLL; } 
    

    到定义DllMain 的cpp 文件。然后使用您自己的DllMain 实现,而不是来自 dllmain.obj 的实现。

    当我们尝试使用 MFC 库时,我们肯定会直接包含 afx.h 或者间接地,然后 MFC(afx.h) 告诉链接器找到符号 __afxForceUSRDLL 并将包含 __afxForceUSRDLL 的对象放入程序中,因此链接器搜索并将 dllmodule.obj 放入我们的 程序,因为 __afxForceUSRDLL 是在 dllmodule.cpp 中定义的。

    这是常见的情况。当我们想在一个 mfc dll项目,链接器报错有两个DllMain,一个在 我们的代码,一个在 Dllmodule.obj 中。

    所以我们需要告诉链接器添加我们的 dllmain.obj __afxForceUSRDLL。所以我们需要在我们自己定义了自己的DllMain的cpp文件中定义__afxForceUSRDLL,那么链接器就会忽略 mfc 的 dllmodule.obj,只看到一个 DllMain,从不抱怨。

    来源:http://social.msdn.microsoft.com/Forums/en-US/0d78aa6b-1e87-4c01-a4a7-691335b7351a/how-to-build-mfc-application-dll-in-visual-c-2010

    【讨论】:

    • 为我工作,我包含了 AfxWin.h 和稍微不同的库导致问题:uafxcwd.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已定义
    • 使用 VS2008 和一个 DLL 为我工作,我使用 MFC 集合,特别是 CMapStringToString 导致了链接错误。
    • 我删除了//AFX_MANAGE_STATE(AfxGetStaticModuleState()); stackoverflow.com/a/9070135/1641556
    • 对于必须编译为 32 位和 64 位的代码,请使用 #ifdef X86 extern "C" { int _afxForceUSRDLL; } #else extern "C" { int __afxForceUSRDLL; } #endif
    • @JonDrnek 这应该是:#ifdef _WIN64 extern "C" { int __afxForceUSRDLL; } #else extern "C" { int _afxForceUSRDLL; } #endif
    【解决方案2】:

    如果您仔细阅读链接器错误,并应用一些知识,您可能会自己到达那里:

    链接器将许多已编译的对象和库链接在一起以获取二进制文件。

    每个对象/库描述

    • 它期望在其他对象中出现什么符号
    • 它定义了什么符号

    如果两个对象定义了相同的符号,你会得到这个链接器错误。在您的情况下,mfcs80.lib 和 MSVCRT.lib 都定义了 _DllMain@12 符号。

    摆脱错误:

    1. 找出您真正需要的两个库中的哪一个
    2. 了解如何告诉链接器不要使用另一个(例如使用 tip from James Hopkin

    【讨论】:

    • 缺少细节 - 一些库定义了弱链接,定义正确的库包含顺序将首先使用 mfc,然后使用 msvcrt,因此默默地删除弱链接
    • 这个细节让我震惊和痛苦了好几个小时(在导入库的main 中默默链接)。不过,弱联系可能有其用处。
    【解决方案3】:

    如果您要定义自己的 DllMain,则需要在项目设置中将“配置属性/常规”中的“使用 MFC”设置为“使用标准 Windows 库”。

    您应该在更改后进行干净的重建。

    【讨论】:

    • 我有一个纯 C、非 MFC DLL 设置为“使用标准 Windows 库”,但仍然弹出错误。
    • 我发现从项目设置中定义的预处理器中删除 _WINDOWS -> C/C++ -> 预处理器摆脱了对 MSVCRTD.lib 的虚假引用。我正在使用 VS2010。
    【解决方案4】:

    在我的项目中,我能够通过在项目设置中添加 mfcs80.lib 和 msvcrt.lib 作为附加依赖项来解决这个问题。 “附加依赖项”可以在链接器 -> 输入下找到。

    在调试配置中,必须分别是 mfcs80d.lib 和 msvcrtd.lib。

    顺便说一句,我正在使用 Visual Studio 2010,所以在我的例子中,MFC 库被称为 mfc100.lib。

    我不确定为什么会这样。没有必要将这些 lib 文件添加为附加依赖项,因为我已经将“使用 MFC”设置为“在共享 dll 中使用 MFC”。我猜想通过将这些库指定为附加依赖项,它们以不同的顺序链接。

    此解决方案与 Microsoft 网站上建议的解决方案大致相同:http://support.microsoft.com/kb/148652,除了我不需要在“忽略特定默认库”框中输入任何内容。

    【讨论】:

      【解决方案5】:

      对我来说,直接原因确实是缺少 _afxForceUSRDLL 符号引用,但间接原因是缺少 _USRDLL 宏定义。它是由 VC 向导默认定义的,但有时开发人员会错误地删除它。 Here it is in more words

      【讨论】:

      • 我的情况正好相反!我在应该是 _LIB 的预处理器中有一个流氓 _USRDLL。哇!
      【解决方案6】:

      MSDN 知识库 ID Q148652。

      http://support.microsoft.com/kb/148652

      原因: Visual C++ 按字母顺序编译源文件,并按字母顺序将编译的目标文件传递给链接器。 如果链接器首先处理 DLLDATAX.OBJ,则源代码引用 DllMain,链接器从 MSVCRTD.LIB(dllmain.obj) 加载它。 然后,链接器处理从包含 #include "stdafx.h" 的 C++ 文件编译的目标文件,该文件引用符号 __afxForceUSRDLL,链接器从 MFC42D.LIB(dllmodul.obj) 加载。此对象模块还包含 DllMain 的实现, 引发冲突。

      【讨论】:

        【解决方案7】:

        我有一个非常相似的问题。 [mfcs110d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)] 解决方案是将 mfcs110d.lib 添加到 Additional Dependencies

        【讨论】:

        • 我也遇到同样的错误:mfcs140.lib(dllmodul.obj) : error LNK2005: DllMain already defined in msvcrt.lib(dll_dllmain_stub.obj) 尝试在“附加依赖项”中添加这些库,但是仍然无法解决..我仍然遇到同样的错误..我正在构建 dll 作为最终输出而不是 exe..
        • 有一个简单的项目示例要下载吗?
        【解决方案8】:

        对于所有在 ATL 项目中遇到此错误的人(主要是在尝试添加 MFC 支持时),这是我经过几天的挫折后找到的解决方案!

        首先,this link 对我的帮助比其他所有人都多。它为我指明了正确的方向。如果“生成的文件”(包含代理和存根代码,就像类型 guid)由于某种原因已被删除并重新添加到项目中,则会出现问题。这会导致 Visual Studio 以错误的顺序添加它们!

        通常您首先会遇到“ATL 需要 C++ 编译”错误,但您可能已通过为该文件设置 Yc/Yu(预编译头文件)来解决此问题。

        您接下来应该做的是卸载您的项目并对其进行编辑。搜索定义构建和包含顺序的项目组(ClCompileClInclude)。检查他们的顺序和设置。

        编译应该按以下顺序出现:

        1. dllmain.cppCompileAsManaged 设置为 falsePrecompiledHeader 留空)。
        2. 库源(MyLib.cpp,包含DllCanUnloadNow等)
        3. 代理/存根代码(MyLib_i.c;与dllmain.cpp 具有相同的设置)
        4. stdafx.cppPrecompiledHeader 设置为 Create
        5. 所有其他库源文件(您的实际库内容)
        6. xdlldata.c(与dllmain.cpp具有相同的设置)

        然后应该像这样对包含进行排序:

        1. dllmain.h
        2. MyLib_i.h
        3. Resource.h
        4. stdafx.h
        5. targetver.h
        6. ...(实际库头文件)
        7. xdlldata.h

        修复构建顺序修复了我的项目,并且我能够创建一个新的干净构建。

        【讨论】:

        • 只是想评论一下这个答案非常有帮助;我不知道链接器依赖于项目中的构建包含顺序,但实际上,这解决了我的问题。
        【解决方案9】:

        我个人通过这种方式摆脱了这个错误:右键单击Solution Explorer中的项目,从弹出菜单中选择Properties,单击Linker选项卡并将mfcs71ud.lib添加到Additional Dependencies中。如果您使用的是 Visual Studio 2005,则应该是“80”而不是“71”等等。

        【讨论】:

        • 我有一个非常相似的问题。 [mfcs110d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)] 解决方案是将 mfcs110d.lib 添加到附加依赖项
        【解决方案10】:

        就我而言,预处理器指令有问题。 出于某种原因,_USRDLL 被定义了,而它不应该被定义。

        要检查这个,进入菜单 Project ,选择 Project Properties ,然后选择sn -p Configuration Properties --> 预处理器。

        预处理器指令会在那里找到。

        【讨论】:

        • 此建议必须针对 Visual Studio 2107 稍作更新。在解决方案资源管理器中选择您的项目,右键单击并选择属性。现在转到 C/C++>预处理器>预处理器定义,然后编辑 _USRDLL
        • user1741137 - 通常是正确的,但不必等待 86 年才知道,该建议已经有效了大约 4 年 [snarky: 2017 不是 2107] :)
        【解决方案11】:

        在包含afx.h 之前只需#undef _USRDLL,或者更好的是,编辑您的项目配置并删除宏。

        这是 MFC 扩展 DLL 的常用配置:Build Settings for an MFC DLL

        【讨论】:

          【解决方案12】:

          确保在每个 .cpp 文件的顶部包含“Stdafx.h”。我遇到了完全相同的错误,并且有一个 .cpp 文件根本不包含此标头。添加#include 解决了这个问题。

          【讨论】:

            【解决方案13】:

            我在这里找到了解决方案 Visual Studio 2010 library linking order

            这是:/FORCE:MULTIPLE 在链接器选项中

            我必须将 ATL 和 MFC 混合在一起才能使用 [模块(名称=“我的模块”)];在 MFC 应用程序中与“__hook”关键字一起构建

            【讨论】:

              【解决方案14】:

              我发现这对我有帮助: http://support.microsoft.com/kb/148652

              基本上链接器顺序不正确。 CRT 库在 MFC 库之前被链接。事实证明,必须先链接 MFC 库,然后才能链接 CRT 库。

              Yucko 微软!!

              【讨论】:

                【解决方案15】:

                Project Properties -> Linker Tab -> Input of Visual StudioAdditional Dependancies 字段中声明mfc80ud.libmfcs80ud.lib 以解决此问题。

                【讨论】:

                • 虽然有人在一年前给出了相同的答案,但这个是最重要的,所以我会把我的 5 美分留在这里。似乎 msvcrt.dll 仅在之前未声明时才导入 dllmain。将 mfc*.dll 添加到“附加依赖项”可以更早地处理它并解决问题。正如其他人提到的那样, /FORCE:MULTIPLE 也会对链接器进行屏蔽,但在我的情况下,生成的 .dll 在运行时崩溃了。
                【解决方案16】:

                这里的一些答案有一个共同的主题。

                Avishek Bose:-

                在 Additional 中声明 mfc80ud.lib 和 mfcs80ud.lib 项目属性中的依赖项字段 -> 链接器选项卡 -> 输入 Visual Studio 来解决这个问题。

                vmb100:-

                我正在使用 Visual Studio 2010,所以在我的情况下,MFC 库是 称为 mfc100.lib。

                joseAndresGomezTovar:-

                我有一个非常相似的问题。 [mfcs110d.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已在 MSVCRTD.lib(dllmain.obj)] 中定义和 解决方案是将 mfcs110d.lib 添加到 Additional Dependencies

                所以一般情况似乎是先找到要添加的库的名称...

                然后添加它....

                请注意,似乎有一些prerequisites 和/或alternative 解决方案。

                【讨论】:

                  【解决方案17】:

                  如果您的解决方案有多个导出相同符号的项目,也会发生这种情况。例如,如果您的子项目使用导出 DoFoofoo.def 文件构建foo.dll,并且 使用导出@987654326 的bar.def 文件的bar.dll 的子项目@,会发生冲突,这是您在链接时会看到的错误。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-01-06
                    • 2011-05-31
                    • 2011-02-13
                    • 2014-01-22
                    • 2012-04-25
                    • 1970-01-01
                    • 2014-12-21
                    • 2015-08-10
                    相关资源
                    最近更新 更多