1

将我的应用程序从 VC6 移植到 Visual Studio 2005 时出现错误。

有谁知道这意味着什么?

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

4

3 回答 3

2

来自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 库。

所以

有两种方法可以解决此问题。第一个解决方案涉及强制链接器以正确的顺序链接库。第二种解决方案允许您找到导致问题的模块并进行更正。

任何一个

强制链接器以正确的顺序链接库

  1. 在项目菜单上,单击设置。
  2. 在“项目设置”对话框的“设置”视图中,单击以选择出现链接错误的项目配置。
  3. 在链接选项卡上,单击以选择类别组合框中的输入。
  4. 在忽略库框中,插入库名称(例如,Nafxcwd.lib;Libcmtd.lib)。

    注意 /NOD: 中的链接器命令行等效项。

  5. 在对象/库模块框中,插入库名称。您必须确保它们按顺序列出,并且作为该行中的前两个库(例如,Nafxcwd.lib Libcmtd.lib)。

要在 Visual C++ .NET 中设置此选项,请阅读“设置 Visual C++ 项目属性”联机帮助主题。

或者

找到并更正问题模块 要查看当前库链接顺序,请执行以下步骤:

  1. 在项目菜单上,单击设置。
  2. 在“项目设置”对话框的“设置”视图中,单击以选择出现链接错误的项目配置。
  3. 在链接选项卡上,在项目选项框中键入 /verbose:lib。
  4. 重建你的项目。在链接过程中,库将在输出窗口中列出。
于 2008-12-10T20:49:15.860 回答
2

我确信这可能发生的原因有很多——我发现的最糟糕的一个是在尝试集成一些最初是 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中的项目属性/配置属性/链接器/显示进度)

于 2010-01-19T11:33:40.967 回答
0

您可以将链接器输入设置为忽略项目属性中的麻烦库,但这可能会或可能不会起作用。

于 2014-02-26T15:06:11.697 回答