【发布时间】: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
我收到此链接器错误。
mfcs80.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已在 MSVCRT.lib(dllmain.obj) 中定义
请告诉我消除此错误的正确方法。我在 microsoft 支持网站上阅读了有关此错误的解决方案,但没有太大帮助。
我正在使用带有 Platform SDK 的 VS 2005
【问题讨论】:
标签: c++ visual-c++ linker
我收到了同样的错误信息,但这里的答案都没有为我解决。 因此,如果您在创建使用 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,从不抱怨。
【讨论】:
//AFX_MANAGE_STATE(AfxGetStaticModuleState()); stackoverflow.com/a/9070135/1641556
如果您仔细阅读链接器错误,并应用一些知识,您可能会自己到达那里:
链接器将许多已编译的对象和库链接在一起以获取二进制文件。
每个对象/库描述
如果两个对象定义了相同的符号,你会得到这个链接器错误。在您的情况下,mfcs80.lib 和 MSVCRT.lib 都定义了 _DllMain@12 符号。
摆脱错误:
【讨论】:
main 中默默链接)。不过,弱联系可能有其用处。
如果您要定义自己的 DllMain,则需要在项目设置中将“配置属性/常规”中的“使用 MFC”设置为“使用标准 Windows 库”。
您应该在更改后进行干净的重建。
【讨论】:
在我的项目中,我能够通过在项目设置中添加 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,除了我不需要在“忽略特定默认库”框中输入任何内容。
【讨论】:
对我来说,直接原因确实是缺少 _afxForceUSRDLL 符号引用,但间接原因是缺少 _USRDLL 宏定义。它是由 VC 向导默认定义的,但有时开发人员会错误地删除它。 Here it is in more words。
【讨论】:
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 的实现, 引发冲突。
【讨论】:
我有一个非常相似的问题。 [mfcs110d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)] 解决方案是将 mfcs110d.lib 添加到 Additional Dependencies
【讨论】:
对于所有在 ATL 项目中遇到此错误的人(主要是在尝试添加 MFC 支持时),这是我经过几天的挫折后找到的解决方案!
首先,this link 对我的帮助比其他所有人都多。它为我指明了正确的方向。如果“生成的文件”(包含代理和存根代码,就像类型 guid)由于某种原因已被删除并重新添加到项目中,则会出现问题。这会导致 Visual Studio 以错误的顺序添加它们!
通常您首先会遇到“ATL 需要 C++ 编译”错误,但您可能已通过为该文件设置 Yc/Yu(预编译头文件)来解决此问题。
您接下来应该做的是卸载您的项目并对其进行编辑。搜索定义构建和包含顺序的项目组(ClCompile 和 ClInclude)。检查他们的顺序和设置。
编译应该按以下顺序出现:
dllmain.cpp(CompileAsManaged 设置为 false 和 PrecompiledHeader 留空)。MyLib.cpp,包含DllCanUnloadNow等)MyLib_i.c;与dllmain.cpp 具有相同的设置)stdafx.cpp(PrecompiledHeader 设置为 Create)xdlldata.c(与dllmain.cpp具有相同的设置)然后应该像这样对包含进行排序:
dllmain.hMyLib_i.hResource.hstdafx.htargetver.hxdlldata.h修复构建顺序修复了我的项目,并且我能够创建一个新的干净构建。
【讨论】:
我个人通过这种方式摆脱了这个错误:右键单击Solution Explorer中的项目,从弹出菜单中选择Properties,单击Linker选项卡并将mfcs71ud.lib添加到Additional Dependencies中。如果您使用的是 Visual Studio 2005,则应该是“80”而不是“71”等等。
【讨论】:
就我而言,预处理器指令有问题。
出于某种原因,_USRDLL 被定义了,而它不应该被定义。
要检查这个,进入菜单 Project ,选择 Project Properties ,然后选择sn -p Configuration Properties --> 预处理器。
预处理器指令会在那里找到。
【讨论】:
在包含afx.h 之前只需#undef _USRDLL,或者更好的是,编辑您的项目配置并删除宏。
这是 MFC 扩展 DLL 的常用配置:Build Settings for an MFC DLL
【讨论】:
确保在每个 .cpp 文件的顶部包含“Stdafx.h”。我遇到了完全相同的错误,并且有一个 .cpp 文件根本不包含此标头。添加#include 解决了这个问题。
【讨论】:
我在这里找到了解决方案 Visual Studio 2010 library linking order
这是:/FORCE:MULTIPLE 在链接器选项中
我必须将 ATL 和 MFC 混合在一起才能使用 [模块(名称=“我的模块”)];在 MFC 应用程序中与“__hook”关键字一起构建
【讨论】:
我发现这对我有帮助: http://support.microsoft.com/kb/148652
基本上链接器顺序不正确。 CRT 库在 MFC 库之前被链接。事实证明,必须先链接 MFC 库,然后才能链接 CRT 库。
Yucko 微软!!
【讨论】:
在Project Properties -> Linker Tab -> Input of Visual Studio 的Additional Dependancies 字段中声明mfc80ud.lib 和mfcs80ud.lib 以解决此问题。
【讨论】:
这里的一些答案有一个共同的主题。
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 解决方案。
【讨论】:
如果您的解决方案有多个导出相同符号的项目,也会发生这种情况。例如,如果您的子项目使用导出 DoFoo 的foo.def 文件构建foo.dll,并且 使用导出@987654326 的bar.def 文件的bar.dll 的子项目@,会发生冲突,这是您在链接时会看到的错误。
【讨论】: