运行时库不匹配,尽管将正确的标志传递给所有对象?

RuntimeLibrary mismatch despite the correct flags being passed to all objects?

本文关键字:标志 对象 不匹配 运行时      更新时间:2023-10-16

我试图将一个库(我们称之为LibB)链接到已经链接另一个库(LibA)的程序(TheProgram)。

调试配置构建良好,但在发布模式下出现此错误:

错误 LNK2038:检测到"运行时库"不匹配:值"MT_StaticRelease"与 TheProgram.obj 中的值"MTd_StaticDebug"不匹配

我认为这很容易修复,因为我只需要确保每个链接对象都是使用/MT 构建的。我做到了,他们都是。我还检查了在此配置中是否有任何具有不同运行时标志的每文件设置-没有。还检查了构建中的最终命令行 - 它到处都是/MT。

更有趣的是,如果我链接LibB的调试版本(在构建发布配置时),此错误会消失,但我会收到其他错误。

尽管到处都有匹配的标志,但什么可能导致不匹配?

这让我发疯,花了几天时间才发现。我想在这里分享这个,因为有很多问题的问题实际上是不匹配的/M* 标志,但这里的情况并非如此。

错误是我在调试模式下添加了一个新的预处理器定义,然后将整个字段复制到发布配置中(不想摆弄鼠标选择)。此字段包含_DEBUG(而不是NDEBUG),这会导致链接器检测到/MTd 正在链接。当我在"发布"模式下的预处理器定义中将_DEBUG更改为NDEBUG时,问题已解决。

作为旁注,我试图在git diff中找到错误,因为我有一个很好的想法,哪个提交引入了它,但由于 VS 项目文件格式的性质,如果没有逐字差异,很难看到。一位同事为我发现了这个定义,但他也向我指出了关于在 git diff 中突出显示单词差异的答案,我认为这对于发现这样的问题非常有用。