为什么 MSBuild 使用 C: for Microsoft. Cpp. Default.props 而不是 c: Program Files (x86) MSBuild? (错误 MSB4019)

当我运行 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.
  • 位于 c: Program File (x86)的 MSBuild
  • HKLM SOFTWARE Wow6432Node Microsoft MSBuild ToolVersions V4.0 VCTargetsPath 设置为 $(MSBuildExtensionsPath32) Microsoft. Cpp V4.0
  • 如果运行 msbuild/verversity: diag as good system,则显示 MSBuildExtensionsPath32,MSBuildExtensionsPath64,MSBuildExtensionsPath 设置为 构建开始时的环境
  • 将 MSBuildExtensionsPath32、 MSBuildExtensionsPath64、 MSBuildExtensionsPath 设置为 shell 中的环境变量不会导致它们显示为 构建开始时的环境

试图修复

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

似乎没有正确设置 MSBuildExtensionsPath32,设置 MSBuildExtensionsPath 没有帮助

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

请让我知道,如果你有任何想法是什么阻碍了这个变量的正确设置。

182289 次浏览

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

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

如果没有,则意味着您安装了一些自定义的第三方重写目标,或者您的 MSBuild 安装已损坏。

可以尝试的事情:

  • 修复.NET 安装
  • 应用最新的 VisualStudio 服务包
  • 如上所述手动设置 MSBuildExtensionsPath(请注意64位机器上的 x86部分)

安装 Microsoft Visual C + + 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1修复了我在 Windows7x64上构建的 MSB4019错误。

该更新的自述文件声明推荐的订单为

  1. Visual Studio 2010
  2. Windows SDK 7.1
  3. VisualStudio2010SP1
  4. Visual C + + 2010 SP1编译器更新 Windows SDK 7.1

对于那些没有遵循 MS 禁令的人(参见 十五的回答) ,你仍然可以解决这个问题。

MSBuild 使用 VCTargetsPath来定位默认 cpp 属性,但是不能,因为注册表缺少此 String 值。

检查字符串值

  • 启动 regedit
  • 导航仪呼叫 HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0
  • 检查 VCTargetsPath键。值应该 = “ $(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\

去弥补

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

注: HKLM代表 HKEY_LOCAL_MACHINE

安装 Microsoft Visual C + + 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1对我来说很管用。但是,我在更新时遇到了一些问题,因为我已经安装了 VS2010和 VS2010SP1。正如 在上面的 Xv 中,readme.htm 文件包含“已知问题”部分中最常见的安装问题的解决方案。我将按照 readme.htm 中的说明进行操作,并在每次故障排除尝试后重新启动您的计算机,因为有些安装会写入您的注册表。

我在使用他们的命令行工具(调用 MSBuild)发布 cocos2d-x 应用程序时遇到了这个问题。我使用的是 Win 764位,VS2013 Express,cocos2d-x 版本3.3,。安装了 NET Framework 4.5。

我通过在运行 cocos.py 发布命令之前设置以下内容修复了这个问题:

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

我写了一个 Build 脚本,在递归挖掘 C: Windows Microsoft.NET 文件夹中找到的任何 MSBuild.exe 文件之后,将 MSBuild 放在% PATH% 上,从而发现了这个错误。最后找到的命中目录是放在路径上的目录。因为 dir命令会在 Framework之后打到 Framework64文件夹,所以我得到了一个放在路径上的64位 MSBuilds。我试图构建一个 Visual Studio 2010解决方案,结果把我的搜索字符串从 C:\Windows\Microsoft.NET改成了 C:\Windows\Microsoft.NET\Framework,这样我就得到了一个32位的 MSBuild.exe。现在构建解决方案文件。

我刚在 Hudson 的工作中加入了环境变量。

我最近也遇到过同样的问题,在以不同的顺序安装了不同的软件包之后,它变得非常混乱。然后我找到了这个回购 -https://github.com/felixrieseberg/windows-build-tools

npm install --global windows-build-tools

它安装了编译大多数节点模块所需的 Python & VS Build 工具!

MSBuild 是一个独立的构建工具,经常与其他工具捆绑在一起。它可能已安装在您的计算机上。NET (旧版本)、 VisualStudio (新版本)甚至 TeamFoundationBuild。

MSBuild 需要与将使用它的 VisualStudio 或 TFS 版本相匹配的配置文件、编译器等(工具集) ,以及。NET 中编译源代码。

根据安装 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 路径。

  • 下的 VCTargetsPath 键 MicrosoftMSBuild 工具版本4.0
  • VCTargetsPath 环境变量。

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

我必须添加的唯一一件事情是,当我停止尾随时,环境变量对我不起作用

对于记录,文件 Microsoft.Cpp.Default.props可以修改 env var VCTargetsPath,并使该 var 的后续用法不正确。 我有这个问题,并解决了它通过设置 VCTargetsPath10VCTargetsPath11相同的价值比 VCTargetsPath

这应该根据您正在使用的 VS 版本进行调整。

我在 VS2017环境中看到了这一点。我的构建脚本首先调用 VsDevCmd.bat,为了解决这个问题,我在调用 MSBuild 之前设置了 VCTargetsPath环境变量:

set VCTargetsPath=%VCIDEInstallDir%VCTargets

我在 VisualStudio2015版本中遇到了这个问题。当我使用 cmake 生成一个项目时,出现了这个错误。

错误 MSB4019: 导入的项目“ D: Microsoft.Cpp.Default.props”不是 发现

我通过添加 String 修复了它

VCTargetsPath

有价值

$(MSBuildExtensionsPath32) Microsoft. Cpp v4.0 V140

在注册表路径中

MicrosoftMSBuild 工具版本14.0

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\\'))"

除了把路线设定为:

C:\Program Files\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0

编辑: 这适用于较早版本的 Visual Studio/MSBuild (特别是 MSVC2015?).使用更现代的版本,MSBuild 包含在 VisualStudioBuildTools2019中,编译器位于不同的位置,并以不同的方式进行检测。

这是由于已安装的 MSBuild 工具集和注册表设置不匹配造成的。如果您执行以下一项或多项操作,就可能发生这种情况:

  • 以错误的顺序安装多个 VisualStudio 版本
  • 卸载一个或多个版本的 VisualStudio
  • 手动对 VisualStudio 安装进行注册表更改或修改

据我所知,唯一安全可靠的解决方案就是重新安装你的操作系统。如果项目需要生成多个版本的 VisualStudio,请安装 最古老的版本。然后修复您的代码,这样您就可以使用一个工具来构建它,否则您或您的同事很快就会再次陷入同样的困境。

如果这对您来说不是一个选项,那么首先阅读 https://stackoverflow.com/a/41786593/2279059,以便更好地理解问题以及各种“解决方案”实际上是做什么的。然后,根据您的 VisualStudio 版本和设置,其他答案或者它们的变体之一最终可能会有所帮助。

更多提示:

用于 Windows10上的 VisualStudio2017和2019

这里的许多答案适用于较早版本的 VisualStudio。如果使用 Visual Studio 2017 Community 版本,对我有效的方法是设置一个名为 VCTargetsPath的环境变量,并赋值为

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

如果使用 VisualStudio2019社区版,

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160

其他答案在这里设置这个变量为 c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140,但我注意到在我的视觉工作室安装,没有文件夹称为微软。MSBuild 文件夹中的 Cpp。所以请记住,上面的路径是 VisualStudio2017的 Community 版本。

此外,如果您使用的是 VisualStudio2017Community 版本,请确保环境变量中的 MSBuild 路径指向正确的 MSBuild 版本,

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin

如果使用的是 VisualStudio2019社区版,

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

补充一下 Chris 龚对上述 VS2017/2019的回答(我还没有得到评论许可)。

如果安装的是 VS2019BuildTools 而不是完整的 VisualStudio,那么文件路径略有不同。然后 VCTargetsPath 应该是

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\

还要注意终止反斜杠-至少在我的例子中是必需的(TFS2017,VS2019 Build tools)。对 PATH 条目的相应更改也是如此。

我在 MSBuild 的 VS17版本中遇到了同样的问题

我通过应用以下步骤解决了这个问题:

  • 在我的例子中,Microsoft.Cpp.Default.props文件位于 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets 所以我在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0下的注册表中创建了带有值的 VCTragetsPath字符串 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets

  • 我还让我的 Jenkins 作为管理员用户运行

这解决了我的问题。

在我的例子中,我添加了一个带 path 的环境变量 VCTargetPath

”C: Program Files (x86) MicrosoftVisual Studio 2017 Professional Common7 IDE VC VCTargets”

(’最后是至关重要的,因为项目解决方案文件引用了“ Microsoftcpp 目标”文件。

此外,从 VisualStudio2017MSBUILD 开始,在 VisualStudio 中也会出现这种情况-因此,需要用

C: Program Files (x86) MicrosoftVisual Studio 2017 Professional MSBuild 15.0 Bin

更新 VCTargetPath和 MSBUILD 的 PATH变量并构建修复了错误。

不要在构建后的命令行中设置固定路径,而是先尝试这样做:

SET VCTargetsPath=$(VCTargetsPath)

变量“ $(VCTargetsPath)”似乎是一个 c + + 相关的 Visual-Studio-宏,在 c #-sdk-project 中没有显示为宏,但仍然可以在那里使用。

我卸载了 VSCode,因为我搞砸了安装部分。一年前,我安装了另一个版本,最近又安装了另一个。所以卸载了所有东西之后,从头开始。下载最新版本的 VSCode 和构建工具。那就没问题了。

我在通过命令行调用 msbuild和使用 VisualStudio2019时遇到了问题。

对我来说,有效的做法是在打电话给 msbuild之前先清理环境变量:

set VCTargetsPath=
call %ProgramFiles(x86)%/Microsoft Visual Studio/2019/Professional/MSBuild/Current/Bin\msbuild.exe ...

在我的例子中,我使用了错误的 MSBuild 版本,因为我安装了多个编译器。我通过使用命令(VisualStudio2022)中的完整路径修复了这个问题:

"C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\MSBuild.exe" "C:\path-to-project\myproject.vcxproj"