12

我正在尝试为具有许多解决方案(一些用于 CI,一些用于开发人员)和数百个项目的复杂构建运行纯 x64 构建,并且遇到了“错误 MSB8013:此项目不包含配置和平台组合调试|Win32"

我已将其简化为简单的配置:

  • 解决方案 A 包含项目 X 和项目 Y。项目 X 具有对项目 Y的项目引用。
  • 解决方案 B 还包含项目 X。

没有一个项目或解决方案包含 Win32 平台 - 它已被删除。

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

错误 MSB8013:此项目不包含 Debug|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 管理包依赖项的最终解决方案,但这在短期内是不可行的)

4

5 回答 5

10

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

于 2016-05-27T11:33:05.297 回答
2

看来这是Microsoft.CppBuild.targets文件中的错误。在某些机器上,我看到两个这样的文件:一个C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets大小约为 120KB,一个大小C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets为 77KB。第二个是错误的并且得到错误的 $(Configuration)|$(Platform) 值,这会产生上述错误。这个问题可能与这个主题直接相关,因为我的项目中的 VCTargetsPath 指向错误的 (77KB) Microsoft.CppBuild.targets 目录(我使用的是 VS2015,所以它应该使用 V140 目录中的那个)。我找到了两种解决方法:1)替换错误文件或 2)修改HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\14.0\14.0\VCTargetsPath10注册表以指向正确的文件。

于 2017-04-05T10:11:28.543 回答
2

一种解决方法是手动编辑 .vcxproj 文件以定义默认平台:

  1. 在文本编辑器中打开 vcxproj 文件
  2. 在“全局”属性组中添加这一行:

    <Platform Condition="'$(Platform)' == ''">x64</Platform>

于 2015-10-15T22:32:21.317 回答
1

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

于 2019-05-30T14:27:07.810 回答
1

我发现很难看到你想通过这个实现什么。您是否总是想构建 X AND Y?即使在没有参考 Y 的解决方案中?对我来说是相当不合逻辑的。不过,我可以根据您的需要为您提供一些解决/抑制此问题的解决方案。

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

在解决方案A中,将另一个项目设置为构建依赖项,而不是在项目X中引用项目Y。你不能设置它,只要它引用另一个项目(我总是删除.vcxproj中的引用,它在某个地方在项目的底部),但是一旦您删除了内部项目引用,您就可以拥有对它的解决方案引用,然后它应该可以正常工作。

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

别的

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

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

于 2017-04-19T11:33:41.223 回答