错误LNK2005:_DllMain @ 12已在MSVCRT.lib中定义

时间:2008-12-05 10:01:44

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

我收到此链接器错误。

  

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

请告诉我消除此错误的正确方法。我在微软支持网站上阅读了关于这个bug的解决方案,但它没有多大帮助。

我正在使用VS 2005和Platform SDK

17 个答案:

答案 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,从不抱怨。

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

答案 1 :(得分:13)

如果您彻底阅读了链接器错误并应用了一些知识,那么您可以自己实现:

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

每个对象/库描述

  • 它希望在其他对象中出现的符号
  • 它定义的符号

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

摆脱错误:

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

答案 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(预编译头文件)设置来解决此问题。

接下来应该做的是卸载项目并进行编辑。搜索定义构建和包含顺序(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相同的设置)
  7. 然后应该按照以下顺序订购包含:

    1. dllmain.h
    2. MyLib_i.h
    3. Resource.h
    4. stdafx.h
    5. targetver.h
    6. ...(实际图书馆标题)
    7. xdlldata.h
    8. 修复构建顺序修复了我的项目,我能够创建一个新的干净构建。

答案 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.libAdditional 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添加到其他依赖项

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

Library name

然后添加它....

Add Library to Dependencies

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

答案 16 :(得分:0)

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