7

如果没有指定,msbuild如何选择平台?在我看来,对于某些解决方案,它为其他“x86”选择“混合平台”。

我打开日志的诊断级别,我唯一能看到的是“初始属性”在开头包含例如“平台 = 混合平台”,没有任何解释原因。

为了抢占一些答案,我知道我可以手动覆盖平台。那不是问题。我需要知道 msbuild 在未指定时会做什么。

4

2 回答 2

7

MSBuild 不会选择,但它正在构建的任何 MSBuild 项目都可能默认某些属性。我假设您的问题与 MSBuild 如何构建解决方案文件有关。

msbuild.exe "somesolution.sln" /t:Build

您需要查看构成解决方案的项目,在那里您将看到设置的属性。例如,您可能会在项目文件的顶部看到以下内容:

<PropertyGroup>
  <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  ...
</PropertyGroup>

这显示了一个PropertyGroup包含两个属性ConfigurationPlatform. 它们的值是基于 a 设置的Condition。条件是说如果没有为属性设置值,Configuration它应该默认为“调试”。同样,如果没有设置任何内容,Platform它应该默认为AnyCPU.

您可能还会看到Conditional PropertyGroup

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
</PropertyGroup>

这个条件的意思是,如果属性ConfigurationPlatform匹配DebugAnyCPU那么它应该应用其中包含的所有属性。

需要注意的一点是,属性名称只是一个任意名称,而值只是字符串。但是,在构建 .Net 项目时,有一个约定,这些属性及其值是其中的一部分。要查看默认值是什么,您无需在文本编辑器中打开每个项目。您可以进入 Visual Studio 并查看解决方案配置。

Visual Studio 解决方案配置

于 2013-10-16T11:59:12.967 回答
6

这可能会有所帮助:我正在研究这个并最终通过查看Microsoft.Cpp.Default.props(此版本 Visual Studio 中的第 21 行)找到了我安装的默认平台,该平台位于Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120

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

这意味着在 VS12 (Visual Studio 2013) 下,如果没有明确指定其他平台,MSBuild 将选择 Win32 作为平台。如其他一些问题所述,设置名为的环境变量Platform会将默认值更改为您设置的值。

重要提示:如果您在 Visual Studio 解决方案文件 (*.sln) 而不是项目文件上调用 MSBuild,并且您没有在 MSBuild 参数中指定平台,那么 MSBuild 似乎会根据SolutionConfigurationPlatforms解决方案文件中全局部分下的第一个条目。我在任何地方都没有发现这一点,但从实验来看似乎是这样。这意味着编辑您的项目文件并提供不同的默认平台属性(如上所述),MSBuild 将忽略此默认值,因为它甚至在开始查看项目之前就已经选择了平台。直接在项目文件上调用 MSBuild 似乎绕过了这种行为。

于 2015-05-20T14:20:03.370 回答