VC ++ / DEFAULTLIB问题

时间:2010-07-08 12:02:51

标签: visual-c++ visual-studio-2005 linker

在发布版本中链接我的dll时,我得到了 -

  

1> LINK:警告LNK4098:defaultlib   'mfc80d.lib'与使用冲突   其他图书馆;使用/ NODEFAULTLIB:库

     

1> LINK:警告LNK4098:defaultlib   'mfcs80d.lib'与使用冲突   其他图书馆;使用/ NODEFAULTLIB:库

     

1> LINK:警告LNK4098:defaultlib   'msvcrtd.lib'与使用冲突   其他图书馆;使用/ NODEFAULTLIB:库

添加/ VERBOSE,我看到以下内容(摘录): ...

  

1>搜索D:\ Microsoft Visual   Studio 8 \ VC \ atlmfc \ lib \ mfc80d.lib:

     

1>   找到“public:virtual __thiscall   AFX_MODULE_STATE ::〜AFX_MODULE_STATE(无效)”   (?? 1AFX_MODULE_STATE @@ UAE @ XZ)1>
  在mfcs80.lib(dllmodul.obj)中引用   1 GT;加载   mfc80d.lib(MFC80D.DLL)

     

1>发现“长期stdcall   AfxWndProc(struct HWND__ *,unsigned   int,unsigned int,long)“   (?AfxWndProc @@ YGJPAUHWND __ @@ IIJ @ Z)

     

1>   在mfcs80.lib(dllmodul.obj)中引用   1 GT;加载   mfc80d.lib(MFC80D.DLL)

     

...

如果我正确地解释了这一点,则意味着链接器以某种方式解析来自(优化的)库mfcs80的调用,作为对(非优化的)库mfc80D的调用。怎么会这样??

当我添加/NODEFAULTLIB:mfc80d.lib时,警告消失了,但我还没有安静下来。顺便说一下,该模块确实遭受了增量链接上偶然发生的莫名其妙的崩溃,这只能通过重新构建来解决。我正在使用VS2005。

[编辑:]将标题更改为包含DEFAULTLIB,希望更好地关注主题。我看到一个明确的行说

  

已处理/DEFAULTLIB:mfc80d.lib

,以及许多其他(非调试)默认库。它从何而来?我该如何解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:2)

您应该检查项目的运行时库设置,听起来像是不匹配。在C / C ++>下的项目设置中代码生成>运行时库,您可以选择:

  • 多线程
  • 多线程调试
  • 多线程DLL
  • 多线程调试DLL

听起来您的解决方案中的某些项目可能正在使用Debug版本,而其他项目则使用非调试版本。或者,某些项目可能正在使用Debug版本,而其他项目正在使用Debug DLL版本。对于给定的解决方案配置,您希望所有项目都使用相同的设置。

答案 1 :(得分:2)

这个问题很晚才得到解决 - 我将它发布在这里以防万一有一天它会帮助某人。

原来是一个错误的预编译头路径:发布配置指向默认的调试PCH路径。因此,在从调试到发布的过渡中,构建将拖入所有调试PCH内容 - 显然包括MFC #pragma(注释“lib ..”)的一些调试版本(包含在afx头文件中)。干净的构建将正确地重建PCH,但是再次进入调试文件夹 - 从而在转换回调试版本时导致相同的问题。

答案 2 :(得分:0)

这意味着其中一个依赖dll使用不同的run-time library进行编译。

项目 - >属性 - > C / C ++ - > Code Generaion - >运行时库

浏览所有库,看看它们是以相同的方式编译的。

此链接中有关此错误的更多信息:

warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs