问题描述
我在项目中一直遇到此错误。 该项目有许多子项目,并且这些子项目已部署为静态库。
我之前曾遇到此错误,但为所有静态库配置的运行时库都相同,而.exe可以帮助我摆脱它。大多数错误都消失了,但是即使所有项目的配置都相同,静态库中的一个也会引发此错误。
Error LNK2038 mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MTd_StaticDebug' in application.obj flRenderServer D:\Projects\FLProject\RenderBox\singlegame_renderBox\Production\FantasticLeague\_Code\FLeague\flRenderServer\miniEngine.lib(miniEngine.obj) 1
这是相似的
Severity Code Description Project File Line Suppression State
Error LNK2038 mismatch detected for '_IteraTOR_DEBUG_LEVEL': value '0' doesn't match value '2' in application.obj flRenderServer D:\Projects\FLProject\RenderBox\singlegame_renderBox\Production\FantasticLeague\_Code\FLeague\flRenderServer\miniEngine.lib(miniEngine.obj) 1
除此之外,没有其他库给出任何错误。 任何帮助将不胜感激,谢谢:)
解决方法
如果静态库和可执行文件本身使用不同的配置进行编译,则通常会发生这种情况。就您而言,miniEngine
似乎是在调试配置中编译的,而您的可执行文件是在发行配置中的。有时,迭代器调试级别是由#define _ITERATOR_DEBUG_LEVEL ...
或项目属性中的预处理程序定义直接设置的。 RuntimeLibrary
的值受编译器标志/MD[d]
和/MT[d]
的影响。
详细信息:如果目标文件包含链接器指令LINK2038
和/FAILIFMISMATCH:<Name>=<Value>
且<Value>
之间存在某些不匹配,则链接器将发出错误<Name>
链接的目标文件。您可以使用dumpbin /DIRECTIVES <object-file>
列出目标文件的链接器伪指令。这些伪指令通常由某些头文件中的#pragma detect_mismatch("<Name>","<Value>")
行设置。该值取决于构建目标文件所使用的特定配置。这些指令试图确保您不会将不兼容的目标文件链接在一起。例如,在调试模式下编译的目标文件可能期望某些标准类(例如迭代器)具有不同的类布局。
可能的原因:
- 在静态库的一个源文件中手动定义
#define _ITERATOR_DEBUG_LEVEL
,但在可执行文件的任何源文件中均未手动定义,反之亦然 - 到静态库的调试版本的可执行链接:项目属性中链接器属性中“其他依赖项”和“其他库目录”中的值将链接器引导到静态库的调试版本。只要可执行文件是在调试配置中构建的,它就可以工作,但是如果是在发布配置中构建,则魔术会中断。
- 可执行文件或静态库的项目属性中“ C / C ++属性”中“代码生成属性”中的“运行时库”的值是手动设置的另一个不匹配值。
请仔细检查链接的静态库和可执行文件的路径和配置。