MSBuild 不适用于 VS2015 (v140) 工具包的 VS2017

MSBuild doesn't work in VS2017 for VS2015 (v140) toolkit

我已经安装了带有 v141 (2017) 和 v140(2015) 工具包的 VS2017。

遗憾的是,MSBUILD 命令行不适用于 v140 工具包。

当我使用 "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" 时出现此错误:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets(64,5):错误 MSB8020:找不到 v140 的构建工具(平台工具集 = 'v140')。要使用 v140 构建工具构建,请安装 v140 构建工具。或者,您可以升级到当前的 Visual Studio 工具,方法是选择“项目”菜单或右键单击解决方案,然后选择 "Upgrade Solution..."。 [q:\ExternalLibraries\cryptopp-5.6.5-2015\cryptlib.vcxproj]

但是当我在 VS IDE 中打开相同的 project/solution 时,我看到该项目已经配置为 2015 项目并且我可以使用 v140 工具包毫无问题地编译它。

还值得注意的是,NMAKE 命令行工具可以正常工作。只有 MSBUILD return 出现这个奇怪的错误。

我还需要做些什么才能在 VS2017 的命令行中使用 VS140 工具包吗?

编辑:

根据 IDE 中的详细 VS 日志,似乎 IDE 默默地忽略了工具版本。这是来自 log

的错误消息

项目文件包含 ToolsVersion="12.0"。此工具集可能未知或丢失,在这种情况下,您可以通过安装适当版本的 MSBuild 来解决此问题,或者由于政策原因,构建可能已被强制使用特定的 ToolsVersion。将项目视为 ToolsVersion="15.0"。详情请见http://go.microsoft.com/fwlink/?LinkId=293424.

所以我尝试将解决方案升级到最新版本,然后手动设置 v140 工具集而不是 v141。

但现在 MSBuilds return 出现以下错误:

"q:\ExternalLibraries\cryptopp-5.6.5-2015\cryptest.sln"(重建目标)(1) -> "q:\ExternalLibraries\cryptopp-5.6.5-2015\cryptest.vcxproj.metaproj"(重建目标)(2) -> "q:\ExternalLibraries\cryptopp-5.6.5-2015\cryptlib.vcxproj"(重建目标)(3) -> q:\ExternalLibraries\cryptopp-5.6.5-2015\cryptlib.vcxproj(44,3): 错误 MSB4019: 导入的项目“q:\Microsoft.Cp p.Default.props" 未找到。确认声明中的路径正确,并且文件存在 在磁盘上。

提到的 import 元素确实存在于 vcxproj 中,具有以下值

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

所以 VCTargetsPath 似乎没有填充,因此 MSBuild 无法找到它。有什么建议吗?

PS:当我从 VS2017 命令提示符 运行 同一个项目时,编译工作没有任何问题。

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat 是不支持 v141.

的 VS 2015 版本

VS 2017 现在支持 side-by-side 安装不同版本的自身,并且它不再共享全局 MSBuild 规则集,这是 VS 2015 和更早版本所做的。您需要使用 VS 2017 版本的 tools/variables 才能使其同时支持 v140v141

对于 VS 2017 企业版,它是 C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Auxiliary\Build\vcvars32.bat

对于社区,它将是 C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Auxiliary\Build\vcvars32.bat

要在命令行中使用v140,您需要使用一些额外的参数:

vcvarsall.bat x86 -vcvars_ver=14.0