我将应用程序从VC6移植到Visual Studio 2005时出错。
有谁知道这意味着什么?
mfcs80.lib(dllmodul.obj):错误 LNK2005:_DllMain @ 12已定义 在MSVCRT.lib(dllmain.obj)
答案 0 :(得分:2)
来自http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652
CRT时发生LNK2005错误 库和MFC库是链接的 在Visual C ++中以错误的顺序
由于
CRT库使用弱外部 新的,删除和的链接 DllMain功能。 MFC库 还包含new,delete和DllMain 功能。这些功能需要 要在之前链接的MFC库 CRT库已链接。
所以
有两种方法可以解决这个问题 问题。第一个解决方案涉及 强制链接器链接 库以正确的顺序。该 第二种解决方案可以让你找到 导致问题的模块和 纠正它。
无论
强制链接器链接 正确的图书馆
- 在“项目”菜单上,单击“设置”。
- 在“项目设置”对话框的“设置”视图中,单击以 选择那个项目配置 正在收到链接错误。
- 在“链接”选项卡上,单击以在“类别”组合框中选择“输入”。
在“忽略库”框中,插入库名称(例如, Nafxcwd.lib; Libcmtd.lib)
。注意/ NOD中的链接器命令行等效项:。
- 在“对象/库模块”框中,插入库名称。您 必须确保列出这些 按顺序和前两个 行中的库(例如, Nafxcwd.lib Libcmtd.lib)。
醇>要在Visual C ++ .NET中设置此选项, 阅读“设置Visual C ++项目” 属性“在线帮助主题。
或者
找到并纠正 问题模块查看当前 库链接顺序,请按照这些 步骤进行:
- 在“项目”菜单上,单击“设置”。
- 在“项目设置”对话框的“设置”视图中,单击以 选择那个项目配置 正在收到链接错误。
- 在“链接”选项卡上,在“项目选项”中键入/ verbose:lib 框。
- 重建您的项目。库将在输出中列出 链接过程中的窗口。
醇>
答案 1 :(得分:2)
我确信这可能会发生多种原因 - 我发现的最糟糕的一个是在尝试集成一些最初是DLLS的静态库(我们的)时(事实上,我们将这些项目都构建为DLL和静态库)。
我们的C ++ / CLI DLL使用这些库的静态版本(为了避免在使用C ++ / CLI Dll时导致ASP.NET加载问题的DLL依赖性问题)并且最初看到相同的链接器错误。< / p>
问题原来是使用AFX_MANAGE_STATE(AfxGetStaticModuleState())宏,当代码构建为DLL但实际上不需要静态库调用时需要该宏。
为了解决这个问题,我最终将以下代码添加到每个项目的stdafx.h中。
#ifdef OMUTILITIES_LINK_STATIC
#undef AfxGetStaticModuleState
#define AfxGetStaticModuleState AfxGetModuleState
#endif
当然,这可能不是您的具体问题。但我最终想到的方法是打开链接器的/ VERBOSE选项,看看谁,什么,哪里和哪个当它拉入运行时库时。 (项目属性/配置属性/链接器/ vs2005中的显示进度)
答案 2 :(得分:0)
您可以设置链接器输入以忽略项目属性中令人不安的库,但这可能有效,也可能无效。