我收到此链接器错误。
mfcs80.lib(dllmodul.obj):错误LNK2005:_DllMain @ 12已在MSVCRT.lib(dllmain.obj)中定义
请告诉我消除此错误的正确方法。我在微软支持网站上阅读了关于这个bug的解决方案,但它没有多大帮助。
我正在使用VS 2005和Platform SDK
答案 0 :(得分:40)
我有同样的错误信息,但这里的答案都没有为我解决。 因此,如果您在创建使用MFC的DLL项目时遇到该问题,可以通过输入以下行来解决该问题:
extern "C" { int _afxForceUSRDLL; }
到定义DllMain
的cpp文件。然后使用您自己的DllMain
实现,而不是来自dllmain.obj的实现。
当我们尝试使用MFC库时,我们肯定会直接包含afx.h 或间接,然后MFC(afx.h)告诉链接器找到符号 __afxForceUSRDLL并将包含__afxForceUSRDLL的对象放入程序中,以便链接器搜索并将dllmodule.obj放入我们的 程序,因为__afxForceUSRDLL是在dllmodule.cpp中定义的。
这是常见的情况。当我们想要使用我们自己的DllMain时 mfc dll项目,链接器抱怨有两个DllMain,一个在 我们的代码,Dllmodule.obj中的一个。
所以我们需要告诉链接器添加我们的dllmain.obj __afxForceUSRDLL。所以我们需要在我们自己的cpp文件中定义__afxForceUSRDLL,我们自己定义了DllMain,然后链接器会忽略 mfc的dllmodule.obj,只看到一个DllMain,从不抱怨。
答案 1 :(得分:13)
如果您彻底阅读了链接器错误并应用了一些知识,那么您可以自己实现:
链接器将许多编译对象和库链接在一起以获取二进制文件。
每个对象/库描述
如果两个对象定义了相同的符号,则会得到这个链接器错误。在您的情况下,mfcs80.lib和MSVCRT.lib都定义_DllMain @ 12符号。
摆脱错误:
答案 2 :(得分:11)
如果您要定义自己的DllMain,则需要在项目设置中将“配置属性/常规”中的“使用MFC”设置为“使用标准Windows库”。
更改后应该进行干净的重建。
答案 3 :(得分:8)
在我的项目中,我能够通过在项目设置中添加mfcs80.lib和msvcrt.lib作为附加依赖项来解决此问题。 “附加依赖项”可以在“链接器”下找到 - >输入
在调试配置中,必须分别是mfcs80d.lib和msvcrtd.lib。
顺便说一下,我正在使用Visual Studio 2010,所以在我的情况下,MFC lib被称为mfc100.lib。
我不确定为什么会这样。没有必要将这些lib文件添加为附加依赖项,因为我已经将“使用MFC”设置为“在共享dll中使用MFC”。我想通过将这些库指定为附加依赖项,它们以不同的顺序链接。
此解决方案与Microsoft网站上建议的解决方案大致相同:http://support.microsoft.com/kb/148652,但我不需要在“忽略特定默认库”框中输入任何内容。
答案 4 :(得分:6)
对我来说,直接原因确实是缺少_afxForceUSRDLL符号引用,但间接原因是缺少_USRDLL宏定义。它由VC向导默认定义,但偶尔会错误地擦除它。 Here it is in more words。
答案 5 :(得分:3)
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的实现, 导致冲突。
答案 6 :(得分:3)
对于所有在ATL项目中遇到此错误的人(主要是在尝试添加MFC支持时),这是我在经历了几天的挫折之后找到的解决方案!
首先,this link比其他所有人对我更有帮助。它指出了我正确的方向。如果由于某种原因“生成的文件”(包含代理和存根代码,就像类型guids)已被删除并重新读入项目,则会出现问题。这会导致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.h
MyLib_i.h
Resource.h
stdafx.h
targetver.h
xdlldata.h
修复构建顺序修复了我的项目,我能够创建一个新的干净构建。
答案 7 :(得分:2)
在我的情况下,我遇到了预处理程序指令的问题。
出于某种原因_USRDLL
被定义,但它不应该被定义。
要检查此项,请转到菜单 Project ,选择项目属性,然后选择代码段配置属性 - > 预处理器。
预处理器指令将在那里找到。
答案 8 :(得分:2)
我有一个非常类似的问题。 [mfcs110d.lib(dllmodul.obj):错误LNK2005:_DllMain @ 12已经在MSVCRTD.lib(dllmain.obj)中定义]并且解决方案将mfcs110d.lib添加到其他依赖项
答案 9 :(得分:1)
我个人以这种方式摆脱了这个错误:在Solution Explorer
中右键单击项目,从弹出菜单中选择Properties
,点击Linker
标签并添加{{1进入mfcs71ud.lib
。如果您使用的是Visual Studio 2005,则它应为“80”而不是“71”,依此类推。
答案 10 :(得分:1)
在#undef
之前_USRDLL
只需afx.h
,或者甚至更好,编辑项目配置并移除宏。
这是MFC扩展DLL的常用配置:Build Settings for an MFC DLL
答案 11 :(得分:0)
我在这里找到了解决方案 Visual Studio 2010 library linking order
这是:/ FORCE:MULTIPLE 在链接器选项
中我必须将ATL和MFC混合在一起使用 [module(name =" mymodule")]; MFC应用程序中的构造以及" __ hook"关键字
答案 12 :(得分:0)
我发现这对我有所帮助: http://support.microsoft.com/kb/148652
基本上,链接器顺序不正确。 CRT库在MFC库之前被链接。事实证明,MFC库必须首先链接,然后可以链接CRT库。
Yucko Microsoft !!
答案 13 :(得分:0)
在mfc80ud.lib
的{{1}}字段中声明mfcs80ud.lib
和Additional Dependancies
以解决问题。
答案 14 :(得分:0)
确保在每个.cpp文件的顶部包含“Stdafx.h”。我得到完全相同的错误,并有一个单独的.cpp文件,根本不包括此标题。添加#include解决了这个问题。
答案 15 :(得分:0)
在这里,一些答案贯穿着一个共同的主题。
Avishek Bose:-
在附加程序中声明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添加到其他依赖项
所以一般情况似乎是先找到要添加的库的名称...
然后添加它....
请注意,似乎有一些prerequisites和/或alternative解决方案。
答案 16 :(得分:0)
如果您的解决方案有多个导出相同符号的项目,也会发生这种情况。例如,如果您有一个子项目使用foo.dll
文件构建foo.def
,而该文件导出了DoFoo
,而一个bar.dll
的子项目具有一个导出DoFoo
的bar.def文件,将发生冲突,这是您链接时看到的错误。