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

mah*_*esh 32 c++ linker visual-c++

我收到此链接器错误.

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

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

我正在使用VS 2005和Platform SDK

Con*_*tin 42

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

extern "C" { int _afxForceUSRDLL; } 
Run Code Online (Sandbox Code Playgroud)

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

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

这是常见的情况.当我们想在mfc dll项目中使用我们自己的DllMain时,链接器抱怨有两个DllMain,一个在我们的代码中,一个在Dllmodule.obj中.

所以我们需要告诉链接器为__afxForceUSRDLL添加我们的dllmain.obj.所以我们需要在我们自己的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

  • 我删除了`//AFX_MANAGE_STATE(AfxGetStaticModuleState());` http://stackoverflow.com/a/9070135/1641556 (2认同)
  • 对于必须编译为 32 位和 64 位的代码,请使用 #ifdef _X86_ extern "C" { int _afxForceUSRDLL; } #else extern "C" { int __afxForceUSRDLL; } #万一 (2认同)

xto*_*ofl 14

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

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

每个对象/库都描述

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

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

摆脱错误:

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

  • +1好点 - 我没有正确地阅读错误.最近,当MFC库选项神秘地启动时,我自己也遇到了类似的链接器错误. (3认同)
  • 缺少细节 - 一些库定义弱连接,定义正确的库包含顺序将首先使用mfc而第二次使用msvcrt,因此静默地删除弱连接 (2认同)

Jam*_*kin 11

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

更改后应该进行干净的重建.

  • 我有一个纯C,非MFC DLL设置为"使用标准Windows库",但错误仍然弹出. (3认同)
  • 我发现从 Project Settings -> C/C++ -> Preprocessor 中的预处理器定义中删除 _WINDOWS 消除了对 MSVCRTD.lib 的虚假引用。我用的是VS2010。 (2认同)

vmb*_*100 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,但我不需要在"忽略特定的默认库"框中键入任何内容.


Ofe*_*lon 6

对我来说,直接原因确实是缺少_afxForceUSRDLL符号引用,但间接原因是缺少_USRDLL宏定义.它由VC向导默认定义,但偶尔会错误地擦除它. 在这里,它更多的是.

  • 我刚好相反!我在预处理器中有一个流氓 _USRDLL,它应该是一个 _LIB。哦! (2认同)

小智 5

MSDN 知识库 ID Q148652。

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

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