如果没有指定,msbuild如何选择平台?在我看来,对于某些解决方案,它选择"混合平台"对于其他人" x86"。
我打开了日志记录的诊断级别,我唯一能看到的是"初始属性"在开头包含例如"平台=混合平台"没有任何解释原因。
为了抢占一些答案,我知道我可以手动覆盖平台。这不是问题。我需要知道msbuild在未指定时会做什么。
答案 0 :(得分:7)
MSBuild不会选择,但它正在构建的任何MSBuild项目都可以默认某些属性。我假设您的问题与MSBuild如何构建解决方案文件有关。
msbuild.exe "somesolution.sln" /t:Build
您需要查看构成解决方案的项目,在那里您将看到设置的属性。例如,您可能会在项目文件的顶部看到以下内容:
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
...
</PropertyGroup>
这会显示PropertyGroup
包含两个属性Configuration
和Platform
。它们的值基于Condition
设置。条件说,如果没有为属性Configuration
设置任何值,它应该默认为'Debug'。同样,如果Platform
没有设置任何内容,则默认为AnyCPU
。
您可能还会看到Conditional
PropertyGroup
:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
</PropertyGroup>
这种情况表明,如果属性Configuration
和Platform
匹配Debug
和AnyCPU
,那么它应该应用其中包含的所有属性。
值得注意的是,属性名称只是一个任意名称,值只是字符串。但是,在构建.Net项目时,有一个约定,这些属性及其值是其中的一部分。要查看默认值,您不需要在文本编辑器中打开每个项目。您可以进入Visual Studio并查看解决方案配置。
答案 1 :(得分:4)
这可能有所帮助:我正在研究这个问题,最后通过查看Microsoft.Cpp.Default.props
中的Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
(此版本的Visual Studio中的第21行)来查找我的安装的默认平台:<Platform Condition="'$(Platform)' == ''">Win32</Platform>
:
Platform
这意味着在VS12(Visual Studio 2013)下,如果没有明确指定其他平台,MSBuild将选择Win32作为平台。如其他一些问题所述,设置名为SolutionConfigurationPlatforms
的环境变量会将默认值更改为您设置的值。
重要说明:如果在Visual Studio解决方案文件(* .sln)上调用MSBuild而不是项目文件,并且未在MSBuild参数中指定平台,则似乎MSBuild将根据解决方案文件中flake8
全局部分下的第一个条目自动选择平台。我没有在任何地方找到这个记录,但从实验来看似乎就是这种情况。这意味着编辑项目文件并提供不同的默认平台属性(如上所述),MSBuild将忽略此默认值,因为它甚至在开始查看项目之前就已经选择了平台。直接在项目文件上调用MSBuild似乎绕过了这种行为。