使用Visual Studio 2017构建项目但_MSC_VER显示1900的问题
问题分析与解决方案
你遇到的核心问题是:尽管已将项目升级到VS2017的v141工具集,但最终生成的project.lib中仍保留着VS2015对应的_MSC_VER=1900版本标记,而非预期的VS2017版本_MSC_VER=1910。这通常由以下几种原因导致,对应的解决方法如下:
1. 链接了未升级的VS2015依赖库
从你的构建日志能看到,链接阶段引入了some_other.lib——如果这个依赖库是用VS2015(v140工具集)编译的,它会自带/FAILIFMISMATCH:"_MSC_VER=1900"的标记,且该标记会被合并到最终输出的project.lib中。
解决方法:
- 确认
some_other.lib是否已用VS2017重新编译;若没有,需将该依赖项目升级到v141工具集并重新构建,替换旧版本的库。 - 检查链接器的「附加库目录」,确保未意外引用到VS2015版本的依赖库路径。
2. 增量构建残留了旧目标文件
如果之前用VS2015编译过项目,即使升级了工具集,增量构建可能会保留部分旧的.obj文件,这些文件中包含旧的_MSC_VER标记。
解决方法:
- 执行彻底清理命令:
# 清理指定项目的Release x64配置 devenv solution.sln /Clean Release /Project project1 /Platform x64 - 手动删除项目输出目录(如
Release\x64)下的所有.obj、.lib及中间文件; - 重新执行完整构建,避免增量构建的影响。
3. 项目配置未完全应用v141工具集
虽然升级报告显示工具集已切换,但可能存在个别配置未更新的情况:
解决方法:
- 在VS2017中打开解决方案,右键点击
project1选择「属性」; - 切换到所有配置(Debug/Release)和平台(Win32/x64),确认平台工具集均设置为
Visual Studio 2017 (v141); - 检查
C/C++ -> 预处理器中的预定义宏,确保没有手动添加_MSC_VER=1900的强制定义; - 检查
C/C++ -> 常规 -> 附加包含目录,确认未指向VS2015的头文件路径(如C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include)。
现象背后的原理
/FAILIFMISMATCH是MSVC链接器的特性,用于确保所有链接的库都用相同版本的编译器编译,避免ABI不兼容问题。当你链接旧编译器编译的库时,该库的版本标记会被保留在最终输出库中——这就是你看到_MSC_VER=1900的根本原因。
内容的提问来源于stack exchange,提问作者devopsfun
相关产品推荐
相关产品推荐

