【问题标题】:VC++ /DEFAULTLIB issueVC++ /DEFAULTLIB 问题
【发布时间】:2011-03-13 07:28:09
【问题描述】:

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

1>LINK : 警告 LNK4098: defaultlib “mfc80d.lib”与使用冲突 其他库;使用 /NODEFAULTLIB:library

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

1>LINK : 警告 LNK4098: defaultlib “msvcrtd.lib”与使用冲突 其他库;使用 /NODEFAULTLIB:library

添加 /VERBOSE,我看到以下内容 (sn-p): ...

1> 搜索 D:\Microsoft Visual 工作室 8\VC\atlmfc\lib\mfc80d.lib:

1> 找到“公共:虚拟 __thiscall AFX_MODULE_STATE::~AFX_MODULE_STATE(void)" (??1AFX_MODULE_STATE@@UAE@XZ) 1>
在 mfcs80.lib(dllmodul.obj) 中引用 1> 已加载 mfc80d.lib(MFC80D.DLL)

1> 发现“长标准调用 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 输出中,以及许多其他(非调试)默认库中。它从何而来?我该如何解决这个问题?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢 - 但我检查了所有项目(和所有单个文件),它们都是用 /MD 编译的。我有很少的外部依赖项:version.dll、shlwapi.dll 和我用dependency-walker 检查的第3 方组件,并且似乎与正确的CRT 版本(非调试)链接。 /MD 开关确实是对 /DEFAULTLIB 开关的唯一访问吗?没有其他输入可能会搞砸吗?
    【解决方案2】:

    这个问题很晚才解决 - 我把它贴在这里以防有一天它对某人有所帮助。

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

    【讨论】:

      【解决方案3】:

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

      项目 -> 属性 -> C/C++ -> 代码生成 -> 运行时库

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

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

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

      【讨论】:

      • 正如我对@bshields(相同)答案的评论,我在发布之前检查了这一点。请参阅我自己(约 1 年后)对最终问题来源的回答。
      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多