运行时库不匹配,尽管将正确的标志传递给所有对象?
RuntimeLibrary mismatch despite the correct flags being passed to all objects?
我试图将一个库(我们称之为LibB
)链接到已经链接另一个库(LibA
)的程序(TheProgram
)。
调试配置构建良好,但在发布模式下出现此错误:
错误 LNK2038:检测到"运行时库"不匹配:值"MT_StaticRelease"与 TheProgram.obj 中的值"MTd_StaticDebug"不匹配
我认为这很容易修复,因为我只需要确保每个链接对象都是使用/MT 构建的。我做到了,他们都是。我还检查了在此配置中是否有任何具有不同运行时标志的每文件设置-没有。还检查了构建中的最终命令行 - 它到处都是/MT。
更有趣的是,如果我链接LibB
的调试版本(在构建发布配置时),此错误会消失,但我会收到其他错误。
尽管到处都有匹配的标志,但什么可能导致不匹配?
这让我发疯,花了几天时间才发现。我想在这里分享这个,因为有很多问题的问题实际上是不匹配的/M* 标志,但这里的情况并非如此。
错误是我在调试模式下添加了一个新的预处理器定义,然后将整个字段复制到发布配置中(不想摆弄鼠标选择)。此字段包含_DEBUG
(而不是NDEBUG
),这会导致链接器检测到/MTd 正在链接。当我在"发布"模式下的预处理器定义中将_DEBUG
更改为NDEBUG
时,问题已解决。
作为旁注,我试图在git diff
中找到错误,因为我有一个很好的想法,哪个提交引入了它,但由于 VS 项目文件格式的性质,如果没有逐字差异,很难看到。一位同事为我发现了这个定义,但他也向我指出了关于在 git diff 中突出显示单词差异的答案,我认为这对于发现这样的问题非常有用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 添加 swig pythoncode 以在 Python 对象上设置自己的标志
- 当自动编译对象文件时,如何使我的makefile使用我的cflags标志
- 为什么本地静态对象的初始化使用隐藏的防护标志?
- Python:我们应该如何编写一个函数来返回对象/列表和布尔标志
- 运行时库不匹配,尽管将正确的标志传递给所有对象?
- 重构具有不同标志的对象文件的makefile
- std::facet 对象上的可变标志
- g++-D标志将定义添加到对象文件中
- 如何为 fstream 对象设置标志FILE_FLAG_BACKUP_SEMANTICS