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