【问题标题】:RuntimeLibrary mismatch despite the correct flags being passed to all objects?尽管将正确的标志传递给所有对象,但 RuntimeLibrary 不匹配?
【发布时间】:2016-09-29 12:52:32
【问题描述】:

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

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

错误 LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 TheProgram.obj 中的值“MTd_StaticDebug”不匹配

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

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

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

【问题讨论】:

    标签: c++ visual-studio msvcrt


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多