为“_MSC_VER”检测到错误 LNK2038 不匹配:值“1700”与 xxxx.obj 中的值“1900”不匹配

Posted

技术标签:

【中文标题】为“_MSC_VER”检测到错误 LNK2038 不匹配:值“1700”与 xxxx.obj 中的值“1900”不匹配【英文标题】:Error LNK2038 mismatch detected for '_MSC_VER': value '1700' doesn't match value '1900' in xxxx.obj 【发布时间】:2019-01-14 03:01:00 【问题描述】:

正在将我的项目从 VS2012 转换为 VS2015。但在某些项目中出现 _MSC_VER 链接器错误。通过谷歌浏览了很长时间后,我发现问题是由于将 VS2012 中创建的库链接到 VS2015 造成的。

如何找出是哪个项目导致了错误?我在这里引用错误:

检测到“_MSC_VER”的错误 LNK2038 不匹配:值“1700”与 xxxx.obj 中的值“1900”不匹配

【问题讨论】:

【参考方案1】:

这表明您的某些代码或静态库是使用 Visual Studio 2012 编译器和 C/C++ 运行时标头/库构建的,而其他代码是使用 Visual Studio 2015 编译器和 C/C++ 运行时标头/库构建的。

虽然 Visual C++ 版本之间的某些类型的链接是稳定的(老式 C、extern "C" 函数、COM 接口等),但所有 C++ 链接都是依赖于版本的。标准 C++ 库(也称为标准模板库)尤其如此,它会在不同版本之间更改内存布局,因此可能会在运行时崩溃。

为了防止这种情况,库将_MSC_VER 链接标记添加到输出代码模块中,以在链接时捕获这些类型的不匹配。

根据设计,Visual Studio 2017/2019 的 C/C++ 运行时已与 Visual Studio 2015 Update 3 C/C++ 运行时二进制兼容,以简化采用。这不是正常模式,VS 2012 与 VS 2015/2017/2019 的二进制不兼容。请参阅this blog post 和Microsoft Docs。

【讨论】:

以上是关于为“_MSC_VER”检测到错误 LNK2038 不匹配:值“1700”与 xxxx.obj 中的值“1900”不匹配的主要内容,如果未能解决你的问题,请参考以下文章

链接器错误 LNK2038:在发布模式下检测到不匹配

错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“2”与 XX.obj 中的值“0”不匹配

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”

LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 file.obj 中的值“MD_DynamicRelease”不匹配

LNK2038, LNKC4743,LNK4098,LNK2001

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug