使用2015 C++ v140平台工具集构建时MSBuild调用错误cl.exe
MSBuild平台工具集映射查询位置及问题排查
MSBuild的平台工具集映射关系不存储在注册表,也不存在硬编码关联VC6的逻辑,所有配置均通过.props、.targets格式的MSBuild脚本文件定义,查询路径如下:
- v140(C2015)工具集的全局配置路径:
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\<目标CPU架构,如Win32/x64>\PlatformToolsets\v140\
该目录下的Microsoft.Cpp.v140.props、Microsoft.Cpp.v140.targets文件明确定义了工具集对应的编译器路径、SDK路径、构建规则等所有参数,正常配置会通过$(VCInstallDir)、$(VCToolsInstallDir)等内置变量指向VS2015的C编译器安装目录,不会关联VC98路径。 - VS2019本地的兼容工具集配置路径:
C:\Program Files (x86)\Microsoft Visual Studio\2019\<你的VS版本,如Community/Professional/Enterprise>\MSBuild\Microsoft\VC\v160\Platforms\<目标CPU架构>\PlatformToolsets\
高版本VS兼容旧工具集时,会在该目录下存放对应工具集的路径重定向配置。
v140工具集调用VC6编译器的根因
从现象判断,问题本质是v140工具集的路径变量解析失效,回退到全局PATH搜索cl.exe时命中了VC6的编译器,和工具集本身的硬编码无关:
- 大概率是安装VS2019的v140工具集组件时,没有安装完整的VS2015生成工具,只装了工具集的壳配置,导致
$(VCToolsInstallDir)变量为空,MSBuild在预设路径下找不到cl.exe,就会顺着系统PATH环境变量搜索可执行文件。 - 系统PATH中提前加入了VC6的VC98\bin目录,搜索优先级高于其他路径,就会直接调用VC6的cl.exe;把VC98路径从PATH移除后,MSBuild在预设路径和PATH里都找不到cl.exe,自然会抛出找不到文件的错误。
- 可以直接打开项目属性页,定位到「配置属性→VC++目录」,查看「可执行文件目录」的展开值,就能看到当前构建时搜索cl.exe的路径顺序,确认v140对应的编译器路径是否为空。
当前抓到的构建输出确实是VC6.0的编译器,对应版本信息如下:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
正常v140工具集对应的cl.exe版本号为19.00开头,和VC6的12.00版本有明确区分。
内容的提问来源于stack exchange,提问作者raz789
相关产品推荐
相关产品推荐

