2010-07-08 62 views
5

当链接我的发布版本的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,希望更好地将主题聚焦。我看到一个明确的行话说

处理/DEFAULTLIB:mfc80d.lib

在/ VERBOSE输出

,许多其他(非调试)默认库中。它从何而来?我怎样才能解决这个问题?

谢谢!

回答

2

这个问题后来得到解决 - 我将它张贴在这里,以防某天有助于某人。

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

2

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

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

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

+0

感谢 - 但我检查了所有项目(和所有个人文件),而且都用/ MD编译。我有很少的外部依赖项:version.dll,shlwapi.dll和第三方组件,我使用dependency-walker进行了检查,并且似乎与正确的CRT版本(非调试版)链接。/MD交换机是否是对/ DEFAULTLIB交换机的唯一访问?没有其他输入可能会把它搞砸吗? – 2010-07-08 14:57:14

0

这意味着其中一个依赖dll被编译为不同的run-time library

项目 - >属性 - > C/C++ - >代码Generaion之 - >运行时库

去了所有的图书馆,看到他们以同样的方式进行编译。

更多关于此错误在此链接:

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

+0

正如我评论@ bshields(相同)的答案,我检查之前发布在这里。请参阅我自己的(〜1年以后)最终问题来源的答案。 – 2011-04-12 07:24:39