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
xto*_*ofl 14
如果您彻底阅读了链接器错误并应用了一些知识,那么您可以自己实现:
链接器将许多编译对象和库链接在一起以获取二进制文件.
每个对象/库都描述
如果两个对象定义相同的符号,则会得到此链接器错误.在您的情况下,mfcs80.lib和MSVCRT.lib都定义_DllMain @ 12符号.
摆脱错误:
Jam*_*kin 11
如果您要定义自己的DllMain,则需要在项目设置中将"配置属性/常规"中的"使用MFC"设置为"使用标准Windows库".
更改后应该进行干净的重建.
在我的项目中,我能够通过在项目设置中添加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,但我不需要在"忽略特定的默认库"框中键入任何内容.
小智 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 的实现,从而导致冲突。
| 归档时间: |
|
| 查看次数: |
47386 次 |
| 最近记录: |