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