将C ++应用程序从VC6移植到VS2005后出现链接器错误

时间:2008-12-10 12:52:58

标签: visual-c++ visual-studio-2005 mfc vc6

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

有谁知道这意味着什么?

  

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

3 个答案:

答案 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库已链接。

所以

  

有两种方法可以解决这个问题   问题。第一个解决方案涉及   强制链接器链接   库以正确的顺序。该   第二种解决方案可以让你找到   导致问题的模块和   纠正它。

无论

  

强制链接器链接   正确的图书馆

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

    。      

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

  8.   
  9. 在“对象/库模块”框中,插入库名称。您   必须确保列出这些   按顺序和前两个   行中的库(例如,   Nafxcwd.lib Libcmtd.lib)。
  10.         

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

或者

  

找到并纠正   问题模块查看当前   库链接顺序,请按照这些   步骤进行:

     
      
  1. 在“项目”菜单上,单击“设置”。
  2.   
  3. 在“项目设置”对话框的“设置”视图中,单击以   选择那个项目配置   正在收到链接错误。
  4.   
  5. 在“链接”选项卡上,在“项目选项”中键入/ verbose:lib   框。
  6.   
  7. 重建您的项目。库将在输出中列出   链接过程中的窗口。
  8.   

答案 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)

您可以设置链接器输入以忽略项目属性中令人不安的库,但这可能有效,也可能无效。