x64 生成:错误 MSB8013:此项目不包含 Debug|赢32

x64 build: error MSB8013: This project doesn't contain the Configuration and Platform combination of Debug|Win32

本文关键字:Debug 包含 项目 生成 错误 MSB8013 x64      更新时间:2023-10-16

我正试图获得一个纯x64构建运行一个复杂的构建与许多解决方案(一些CI,一些开发人员)和数百个项目,并遇到"错误MSB8013:此项目不包含调试的配置和平台组合|Win32"

我把它简化为一个简单的配置:

  • 方案A包含项目X & &;项目Y.项目X有一个项目参考项目y
  • 方案B包含x项目。

所有项目或解决方案都不包含Win32平台-已被删除。

当我构建解决方案B(作为x64)时,我收到

错误MSB8013:此项目不包含配置和平台组合调试|Win32

错误信息有时包含额外的信息:

此错误也可能出现,如果其他项目试图遵循项目对项目参照本项目,本项目一直未加载或未包含在解决方案中,并且引用项目不能使用相同或等效的配置进行构建或平台。

问题是引用项目"使用相同或等效的配置或平台构建"。

查看msbuild诊断,正在构建项目Y,因为项目X包含对它的项目引用。但是在构建项目Y之前,配置和平台属性被删除了:

1>Task "MSBuild" (TaskId:28)
1>  Removing Properties: (TaskId:28)
1>    Configuration (TaskId:28)
1>    Platform (TaskId:28)

结果Microsoft.Cpp.Default.props启动并将这些设置为Debug|Win32:

1>Task "Message" (TaskId:11)
1>  Configuration=Debug (TaskId:11)
1>Done executing task "Message". (TaskId:11)
1>Task "Message" (TaskId:12)
1>  Platform=Win32 (TaskId:12)
1>Done executing task "Message". (TaskId:12)

我怎样才能防止这种情况并使msbuild通过所选的配置&平台?

(我理解使用NuGet来管理包依赖的最终解决方案,但这在短期内是不可行的)

我可以通过将所有引用的项目包含到解决方案中来解决类似的问题——在这种情况下,将项目Y包含到解决方案b中。

这似乎是Microsoft.CppBuild.targets文件中的错误。在一些机器上,我看到两个这样的文件:一个在C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140Microsoft.CppBuild.targets中,大小为~120KB, C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppBuild.targets大小为77KB。第二个是错误的,并且得到错误的$(Configuration)|$(Platform)值,从而产生上述错误。这个问题可能与这个主题直接相关,因为我的项目中的VCTargetsPath指向错误的(77KB) Microsoft.CppBuild.targets目录(我使用VS2015,所以它应该使用V140目录中的目录)。我发现了两个解决方案:1)替换有bug的文件或2)修改HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftMSBuildToolsVersions14.014.0VCTargetsPath10注册表以指向正确的文件。

一种修复方法是手动编辑.vcxproj文件来定义默认平台:

  1. 在文本编辑器中打开vcxproj文件
  2. 在"Globals"属性组中添加这行:

    & lt;平台条件= " $(平台 )' == ''"& gt; x64<Platform>

由于缺乏rep,我无法添加评论,但与user1825216的答案相同,我正在从命令行运行MSBuild,因此我通过将-p:Platform=x64添加到构建命令中而不是修改.vcxproj来解决此错误。

我发现很难看出你想通过这个达到什么目的。你总是想建立X和Y吗?即使在不涉及Y的解中?对我来说是相当不合逻辑的。不过,我可以根据你的需要,为你提供一些解决方案来解决/抑制这个问题。

如果你想用A构建X&Y,用B构建X

在解决方案A中,将其他项目设置为构建依赖项,而不是在项目x中引用项目Y。你不能设置它,只要它引用其他项目(我总是删除.vcxproj中的引用,它在项目底部的某个地方),但是一旦你删除了内部项目引用,你可以有解决方案引用到它,然后它应该工作得很好。

当你用MSBuild构建解决方案A时,它将构建X和Y,而用MSBuild构建解决方案B

其他

如果您想使用任一解决方案构建X&Y

对不起,但这不是真的可能在MSBuild目前。我建议将项目Y添加到解决方案中并引用它,但是,为什么要这样做呢?你已经有了一个项目,其中包含了它们,如果你想要不同的输出,你可以很容易地进行不同的配置。