检测到“RuntimeLibrary”不匹配:值“MD_DynamicRelease”与应用程序对象中的值“MTd_Static debug”不匹配

Ski*_*ggz 2 c++ dll qt linker-errors visual-studio

我在我的项目中一直面临这个错误。该项目有许多子项目,子项目作为静态库部署。

我之前遇到过这个错误,但是为所有静态库和 .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   
Run Code Online (Sandbox Code Playgroud)

这很相似

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   
Run Code Online (Sandbox Code Playgroud)

除此之外,没有其他库给出任何错误。任何帮助将不胜感激,谢谢:)

phl*_*psy 7

如果您的静态库和可执行文件本身使用不同的配置进行编译,通常会发生这种情况。在您的情况下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++ 属性”中的“代码生成属性”中的“运行时库”值被手动设置为不同的不匹配值。

请仔细检查链接的静态库和可执行文件的路径和配置。