为什么MSBuild在C:\中寻找Microsoft.Cpp.Default.props而不是c:\Program Files (x86)\MSBuild?(错误代码MSB4019)

137
当我运行msbuild来构建一个vc2010项目时,我会收到以下错误信息:
error MSB4019: The imported project "C:\Microsoft.Cpp.Default.props" was not found. 
Confirm that the path in the <Import> declaration is correct, and that the file exists 
on disk.
  • msbuild位于C:\Program File (x86)\MSBuild
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolVersions\V4.0的VCTargetsPath设置为$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\
  • 以"良好系统"身份运行msbuild /verbosity:diag,显示MSBuildExtensionsPath32、MSBuildExtensionsPath64和MSBuildExtensionsPath作为构建开始时的环境变量
  • 将MSBuildExtensionsPath32、MSBuildExtensionsPath64和MSBuildExtensionsPath设置为shell中的环境变量不会导致它们显示为构建开始时的环境变量

尝试修复的问题:

  • 卸载 .net 4.5,修复 .net 4.0
  • 在系统变量中设置 MSBuildExtensionsPath32、MSBuildExtensionsPath64 和 MSBuildExtensionsPath。

看起来 MSBuildExtensionsPath32 没有被正确设置,而设置 MSBuildExtensionsPath 也没有帮助

SET MSBuildExtensionsPath="C:\Program Files\MSBuild"

如果您有任何想法阻止正确设置此变量,请告诉我。


7
好的!这是又一个问题,由于 Visual Studio 安装文件损坏而导致错误,有数百种解决方法,但每一种只适用于特定的情况... - Florian Winter
23个回答

79

使用 cocos2d-x 的命令行工具进行发布时,调用了 MSBuild,我在 Win 7 64 位操作系统上,使用的是 VS2013 express 版本和 cocos2d-x 3.3 版本,并已安装 .NET Framework 4.5。在运行 cocos.py publish 命令之前,我通过设置以下内容解决了问题:

SET VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120

这帮助我安装了oracledb的node包。我按照https://community.oracle.com/docs/DOC-931127上的说明进行操作,即使如此,我仍然遇到了MSB4019错误,但是我通过这个答案进行了修复。 - Pedro Otero
4
PowerShell 版本:[Environment]::SetEnvironmentVariable("VCTargetsPath", "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140", "Machine") - fiat
帮助处理以“v4.0”结尾的路径。 - Alexander
还有一个针对Windows服务器的带有/m标志的'setx'命令。 - john k

52

如果您没有遵循MS建议的顺序(请参见Xv's answer),则仍然可以解决问题。

MSBuild使用VCTargetsPath来定位默认cpp属性,但由于注册表缺少此字符串值,因此无法定位。

检查字符串值

  • 启动regedit
  • 导航到HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0
  • 检查VCTargetsPath键。 值应为"$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\"

修复方法

  • 启动regedit
  • 导航到HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0
  • 添加字符串值VCTargetsPath
  • 将值设置为"$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\"

注意:HKLM代表HKEY_LOCAL_MACHINE


12
注册表项对我来说已经存在。我需要定义一个名为这个名称的环境变量,并将其设置为注册表中的值,以便通过此问题:set VCTargetsPath=c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0 - elmotec
12
只有使用这个设置 VCTargetsPath=c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v120 才对我起作用。 - ygaradon
1
@cmm-user HKLM代表“HKEY_LOCAL_MACHINE”,你在注册表中一定会找到它。 - Michael Johnston
4
VCTargetsPath不是一个键,而是一个字符串值! - John Smith
6
对我来说,现在是这样的 set VCTargetsPath=c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140。 (说明:该句为Windows命令行代码,将环境变量“VCTargetsPath”设置为指定路径) - Daniel Gray
显示剩余5条评论

27

我最近遇到了相同的问题,试着按不同顺序安装了各种包,结果变得非常混乱。后来我找到了这个repo - https://github.com/felixrieseberg/windows-build-tools

npm install --global windows-build-tools

它安装了Python和VS Build工具,这些工具是编译大多数node模块所需的。它非常好用!


1
很遗憾,这个好东西在Azure上不起作用。 - Aleksey Kontsevich
6
对于那些可能和我一样遇到问题的人,我需要使用--production选项。请运行以下命令:npm install --global --production windows-build-tools。这是根据node-gyp的安装说明操作的:https://github.com/nodejs/node-gyp。 - eliotRosewater

23

适用于Windows 10上的Visual Studio 2017和2019

这里很多答案都适用于较早版本的Visual Studio。如果使用Visual Studio 2017社区版,对我有用的是设置一个名为VCTargetsPath的环境变量,并为其赋值。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets

如果使用的是 Visual Studio 2019 Community 版本,

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160
其他答案将此变量设置为c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140,但我注意到在我的 Visual Studio 安装中,我的 MSBuild 文件夹中没有名为 Microsoft.Cpp 的文件夹。所以请记住这一点,另外上面路径是适用于 Visual Studio 2017 Community 版本的。

此外,请确保你的环境变量中的 MSBuild 路径指向正确的 MSBuild 版本,如果你正在使用 Visual Studio 2017 Community 版本。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin
如果您正在使用Visual Studio 2019社区版,
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

1
在我的电脑上,VCTargetPath 的路径是 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets。 - Madura Pradeep
2
它也可能是Microsoft Visual Studio\2019\BuildTools或类似的变体 - 我想,除了BuildTools和Community之外,您还可以拥有Professional和Enterprise。 vswhere.exe -products * -property installationPath将搜索所有组合,并返回所有已安装产品的位置。 - MSalters
2
'vswhere.exe' is not recognized as an internal or external command, operable program or batch file. - Andrew Koster
1
@AndrewKoster,vswhere似乎在C:\ProgramFiles (x86)\Microsoft Visual Studio\Installer\vswhere.exe中。 - bluish

14

哦,好的。我找到了这个问题的解决方法。添加缺失的注册表键即可。我会发布它,并更新我的安装文档以遵循这个顺序。 - Petra Kahn

6

在64位系统上,MSBuild默认使用以下属性(其中C:是SystemDrive):

MSBuildExtensionsPath = C:\Program Files (x86)\MSBuild
MSBuildExtensionsPath32 = C:\Program Files (x86)\MSBuild
MSBuildExtensionsPath64 = C:\Program Files\MSBuild

如果没有成功,这意味着你可能安装了一些自定义的第三方覆盖目标,或者你的 MSBuild 安装已经损坏。
尝试以下几点:
- 修复 .NET 安装 - 应用最新的 Visual Studio Service Pack - 手动设置 MSBuildExtensionsPath(在 64 位机器上注意加上 x86 部分)

2
感谢您的回复,但在进行以下操作后仍未能设置成功:1)修复 .net 4.5,2)卸载 .net 4.5 并修复 4.0。即使我在环境中手动设置也不起作用。 - Petra Kahn

6

MSBuild是一种独立的构建工具,经常与其他工具捆绑在一起。它可能已随.NET(旧版本)、Visual Studio(新版本)或甚至Team Foundation Build一起安装到您的计算机上。

MSBuild需要与将使用它的Visual Studio或TFS的版本以及编译源代码的.NET版本匹配的配置文件、编译器等(ToolSet)。

根据MSBuild的安装方式,配置文件可能在以下一个或多个路径中:

  • C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\
  • C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\
  • C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\

如其他回答所述,必须指定一个注册表项和/或环境变量来指向ToolSet路径:

  • 位于HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0下的VCTargetsPath键。
  • VCTargetsPath环境变量。

偶尔,像安装工具这样的操作会使注册表和/或环境变量设置不正确。其他答案都是修复它们的变体。

我唯一要补充的是,当我省略尾部的“\”时,环境变量对我无效。


我们在构建代理上遇到了问题,因为没有完整的VS2017安装。我们重新安装了带有特定VC工具集的“工作负载” - 而不是单个组件,并且进行了正确的安装。我们怀疑Visual Studio安装程序在我们自定义组件选择安装期间没有将正确的工具集v141放在VS2017下。 - Lars Pellarin
对我来说,这有助于解决问题 - 我正在使用的脚本“有用地”找到了错误的msbuild.exe并明确调用它。 - Scovetta

5

编辑:本文适用于早期版本的Visual Studio / MSBuild(特别是MSVC2015?)。在更现代的版本中,MSBuild已包含在Visual Studio Build Tools 2019中,编译器位于不同位置并以不同方式检测。

这是由于安装的MSBuild工具集和注册表设置不匹配导致的。如果您执行了以下一个或多个操作,则可能会出现此问题:

  • 错误地安装多个Visual Studio版本
  • 卸载一个或多个Visual Studio版本
  • 手动修改了Visual Studio安装程序中的注册表

我知道的唯一安全可靠的解决方法是重新安装您的操作系统。如果您的项目需要多个版本的Visual Studio来构建,则需先安装最旧的版本。然后修复您的代码,使您可以使用单一工具构建它,否则您或您的同事很快就会陷入同样的麻烦中。

如果这对您来说不是一个选项,请先阅读https://dev59.com/X2Qo5IYBdhLWcg3wZelg#41786593,以更好地理解问题和各种“解决方案”实际上是做什么的。然后,根据您的Visual Studio版本和设置,可能会有其他答案或其变体最终有所帮助。

一些额外的提示:


5

我在使用Visual Studio 2015版时遇到了此问题。当我使用cmake生成项目时,出现了以下错误:

error MSB4019: 未找到导入的项目 "D:\Microsoft.Cpp.Default.props"

我通过在注册表路径

HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0

中添加一个名称为"VCTargetsPath"、数值为

$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\V140

的字符串来解决了这个问题。


完成了这个操作。重启了命令提示符,但问题仍未解决。 - Dan

4

我觉得MSBuild密钥的注册表项很好用。重要的是记住,必须根据你运行的MSBuild版本选择64位或32位分支来完成此操作。我不建议使用环境变量,因为它可能会导致不同版本的MSBuild出现问题。

这个注册表文件可以同时解决这两种情况:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath14"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath14)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0\10.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0\11.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0\12.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0\14.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath14"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath14)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath14"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath14)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0\10.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0\11.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0\12.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0\14.0]
"VCTargetsPath"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"
"VCTargetsPath10"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath10)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\'))"
"VCTargetsPath11"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath11)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V110\\'))"
"VCTargetsPath12"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath12)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V120\\'))"
"VCTargetsPath14"="$([MSBuild]::ValueOrDefault('$(VCTargetsPath14)','$(MSBuildExtensionsPath32)\\Microsoft.Cpp\\v4.0\\V140\\'))"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接