VC++/DEFAULTLIB问题
当链接我的发布版本的DLL,我得到 -VC++/DEFAULTLIB问题
1> LINK:警告LNK4098:defaultlib 'mfc80d.lib' 与使用其他 库冲突;使用/ NODEFAULTLIB:库
1> LINK:警告LNK4098:defaultlib 'mfcs80d.lib' 与使用其他 库冲突;使用/ NODEFAULTLIB:库
1> LINK:警告LNK4098:defaultlib 'msvcrtd.lib'与其他库的使用冲突 ;使用/ NODEFAULTLIB:库
添加/冗长,我看到下面的(片段): ...
1>搜索d:\微软的Visual Studio的 8 \ VC \ atlmfc \ LIB \ mfc80d.lib:
1> 找到 “公共:虚拟__thiscall AFX_MODULE_STATE ::〜AFX_MODULE_STATE(无效)” (?? 1AFX_MODULE_STATE @@ @ UAE XZ)1>
在mfcs80.lib引用(dllmodul .OBJ ) 1>加载 mfc80d.lib(MFC80D.DLL)1>找到 “长STDCALL AfxWndProc(结构HWND__ *,无符号 整型,无符号整型,长)” (?AfxWndProc @@ YGJPAUHWND __ @@ IIJ @ Z)
1> 在mfcs80.lib引用(dllmodul.obj) 1>加载 mfc80d.lib(MFC80D.DLL)
...
如果我正确解释它,这意味着链接器以某种方式解析来自(优化)库mfcs80的调用,作为调用(非优化)库mfc80D的调用。怎么会这样??
当我添加/NODEFAULTLIB:mfc80d.lib警告消失了,但我还没有安静。顺便说一句,该模块的增量链接确实遭受了零星的无法解释的崩溃,只能通过重新构建来解决。我正在使用VS2005。
[编辑]将标题更改为包含DEFAULTLIB,希望更好地将主题聚焦。我做看到一个明确的行话说
在/ VERBOSE输出处理/DEFAULTLIB:mfc80d.lib
,许多其他(非调试)默认库中。它从何而来?我怎样才能解决这个问题?
谢谢!
这个问题后来得到解决 - 我将它张贴在这里,以防某天有助于某人。
原来是一个错误的预编译头文件路径:释放配置指向默认的调试PCH路径。因此,在从调试到发布的转换中,构建会拖入所有调试PCH内容 - 显然包括MFC#pragma(注释“lib ..”)(包含在afx头文件中)的一些调试版本。一个干净的版本会正确地重建PCH,但是再次进入调试文件夹 - 从而在转换回调试版本时产生相同的问题。
您应该检查项目的运行时库设置,听起来像是不匹配。在根据C/C++>代码生成>运行时库,您可以选择您的项目设置:
- 多线程
- 多线程调试
- 多线程DLL
- 多线程调试DLL
听起来像您的解决方案中的一些项目可能使用调试版本,而其他人使用非调试版本。或者,某些项目可能使用Debug版本,而其他项目则使用Debug DLL版本。对于给定的解决方案配置,您希望所有项目都使用相同的设置。
这意味着其中一个依赖dll被编译为不同的run-time library。
项目 - >属性 - > C/C++ - >代码Generaion之 - >运行时库
去了所有的图书馆,看到他们以同样的方式进行编译。
更多关于此错误在此链接:
warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs
正如我评论@ bshields(相同)的答案,我检查之前发布在这里。请参阅我自己的(〜1年以后)最终问题来源的答案。 – 2011-04-12 07:24:39
感谢 - 但我检查了所有项目(和所有个人文件),而且都用/ MD编译。我有很少的外部依赖项:version.dll,shlwapi.dll和第三方组件,我使用dependency-walker进行了检查,并且似乎与正确的CRT版本(非调试版)链接。/MD交换机是否是对/ DEFAULTLIB交换机的唯一访问?没有其他输入可能会把它搞砸吗? – 2010-07-08 14:57:14