我收到此链接器错误.
mfcs80.lib(dllmodul.obj):错误LNK2005:_DllMain @ 12已在MSVCRT.lib中定义(dllmain.obj)
请告诉我消除此错误的正确方法.我在微软支持网站上阅读了关于这个bug的解决方案,但它没有多大帮助.
我正在使用VS 2005和Platform SDK
我有相同的错误消息,但这里的答案都没有为我解决.因此,如果您在创建使用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时,链接器抱怨有两个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
如果您彻底阅读了链接器错误并应用了一些知识,那么您可以自己实现:
链接器将许多编译对象和库链接在一起以获取二进制文件.
每个对象/库都描述
它希望在其他对象中出现什么符号
它定义了什么符号
如果两个对象定义相同的符号,则会得到此链接器错误.在您的情况下,mfcs80.lib和MSVCRT.lib都定义_DllMain @ 12符号.
摆脱错误:
找出你真正需要的两个库
找出如何告诉链接器不要使用另一个(使用例如James Hopkin的提示)
如果您要定义自己的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,但我不需要在"忽略特定的默认库"框中键入任何内容.
对我来说,直接原因确实是缺少_afxForceUSRDLL符号引用,但间接原因是缺少_USRDLL宏定义.它由VC向导默认定义,但偶尔会错误地擦除它. 在这里,它更多的是.