我试图将一个库(我们称它为 LibB
)链接到一个已经链接到另一个库(LibA
)的程序(TheProgram
) .
调试配置构建良好,但在 Release模式下出现此错误:
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in TheProgram.obj
我认为这很容易修复,因为我只需要确保每个链接对象都是使用/MT 构建的。我做到了,他们都是。我还检查了是否有任何文件设置在此配置中具有不同的运行时标志 - 没有。还检查了构建中的最终命令行 - 到处都是/MT。
更有趣的是,如果我链接 LibB
的调试版本(在构建 Release 配置时),这个错误就会消失,但我会收到其他错误。
尽管到处都有匹配的标志,但什么会导致不匹配?
最佳答案
这让我发疯,花了几天时间才发现。我想在这里分享这个,因为有很多问题实际上是不匹配/M* 标志,但这里不是这种情况。
错误是我在 Debug模式下添加了一个新的预处理器定义,然后将整个字段复制到发布配置(不想摆弄鼠标选择)。该字段包含 _DEBUG
(而不是 NDEBUG
),这导致链接器检测到正在链接/MTd。当我在 Release 模式下的 Preprocessor Definitions 中将 _DEBUG
更改为 NDEBUG
时,问题就解决了。
作为旁注,我试图在 git diff
中找到错误,因为我很清楚是哪个提交引入了它,但如果不逐字逐句很难看清 -由于 VS 项目文件格式的性质,word diff。一位同事为我发现了这个定义,但他也向我指出了这个关于 highlighting word differences in git diff 的答案。 ,我认为这对于查找此类问题非常有用。
关于c++ - 尽管向所有对象传递了正确的标志,但 RuntimeLibrary 不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546891/