如何指定MSBuild平台?


155

我正在尝试使用MSBuild来构建具有指定目标平台的解决方案(我同时需要x86和x64二进制文件)。这是我尝试的方式:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"

但是,如果平台不同于“任何CPU”,则构建总是会失败。我究竟做错了什么?

这是MSBuild输出的输出:

C:\ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t:Rebuild / p:Configuration = Release / p:Platform =“ x86” Microsoft(R)构建引擎版本3.5.30729.1 [ Microsoft .NET Framework,版本2.0.50727.3082]版权所有(C)Microsoft Corporation2007。保留所有权利。

建立开始于1.7.2010 8:28:10。在节点0上项目“ SolutionPath \ Solution.sln”(重建目标t)。SolutionPath \ Solution.sln:错误MSB4126:指定的解决方案配置“ Release | x86”无效。请使用“配置”和“平台”属性指定有效的解决方案配置(例如MSBuild.exe Solution.sln / p:Configuration = Debug / p:Platform =“ Any CPU”)或将这些属性留空以使用默认解决方案配置。完成的建筑项目“ SolutionPath \ Solution.sln”(重建对象)-失败。

建立失败。

“ SolutionPath \ Solution.sln”(重建目标)(1)->(“ ValidateSolutionConfiguration”目标)-> SolutionPath \ Solution.sln:错误MSB4126:指定的解决方案配置“ Release | x86”无效。请使用“配置”和“平台”属性指定有效的解决方案配置(例如MSBuild.ex e Solution.sln / p:Configuration = Debug / p:Platform =“ Any CPU”)或将这些属性留空以使用默认解决方案配置。

0 Warning(s)
1 Error(s)

时间已过00:00:00.03

如果我尝试使用devenv为x86 / x64构建它,则它可以完美运行,但是我试图在不安装所有必需版本的Visual Studio的情况下设置构建服务器。顺便说一句,如果那里有更好的免费工具(支持.NET Framework 4),我很想听听它。


1
它怎么会失败?也许某些项目不支持x86平台?
布赖恩(Brian)

3
您确定不需要/ p:Platform =“ Win32”吗?
安德鲁·怀亚特

对于将来的读者,如果想知道如何在不安装Visual Studio的情况下在计算机上安装2017版本的MSBuild,请参阅此其他问题
Wai Ha Lee

@AndrewWyatt-afaik-C ++使用Moden Win32.NET使用x86
Elliot Woods

@ElliotWoods-感谢您的澄清:Win32 / x86-我的观点只是从C ++角度出发。
安德鲁·怀亚特

Answers:


106

如果要为x86x64构建解决方案,则必须为两个平台都配置解决方案。实际上,您只有Any CPU配置。

如何检查项目的可用配置

要检查给定项目的可用配置,请打开项目文件(*.csproj例如)并PropertyGroup使用右边的查找Condition

如果要以Release模式构建,则x86项目文件中必须包含以下内容:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  ...
</PropertyGroup>

如何在Visual Studio中创建和编辑配置

配置管理器面板
(来源:microsoft.com

新解决方案平台按钮
(来源:msdn.com

新的解决方案平台面板
(来源:msdn.com

如何创建和编辑配置(在MSDN上)


使用x86或x64有什么区别?
Acaz Souza 2012年

2
x86构建32位dll /可执行文件,而x64构建64位dll /可执行文件。
本杰明·鲍曼

@Julien是否可以/应该使用.targets文件来设置共享配置?
Jan'splite'K.

4
一些项目用Win32的,而不是x86例如,CMake产生的那些做(libssh2用途CMake)。
Jeroen Wiert Pluimers,2016年

211

在MSBuild或Teamcity中使用命令行

MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64

或使用较短的形式:

MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64

但是,无论如何,您都需要在项目中设置平台,请参阅Julien Hoarau的答案。


没有实现/ property的子设置来识别配置和平台。谢谢
DRapp

7
请注意,MSBuild不考虑Visual Studio“解决方案配置”,而是在为解决方案的每个项目执行xxproj之前设置属性。无论您在Visual Studio中选择哪种项目配置,该解决方案的每个项目的平台和配置都相同。
洛朗·拉里扎

2
或更短一些:/ p:Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
如果对任何人都有用,则命令行上的多字参数用双引号引起来。所以Platform="Any CPU"还是Platform="Mixed Platforms"对于那些需要它的人。
John Doe

14

如果尝试从命令行执行此操作,则可能会遇到一个问题,其中为您设置了计算机范围的环境变量“平台”并对其不利。如果我使用VS2012 Command窗口而不是常规的Windows Command窗口,则可以重现此内容。

在命令提示符下键入:

设置平台

在VS2012命令窗口中,我预设了一个'X64'值。这似乎会干扰我的解决方案文件中的内容。

在常规“命令”窗口中,“设置”命令会产生“未定义变量”消息……这很好。

如果上面的“ set”命令的结果没有返回任何环境变量值,那么您应该一切顺利。


2
当然,这就是VS2012 x64命令窗口与VS2012 x86命令窗口的区别。IOW,是设计
使然

0

对于VS2017和2019 ...使用现代核心库SDK项目文件,可以在构建过程中更改平台。这是anycpu在内置CoreCompile任务运行之前更改平台的示例:

<Project Sdk="Microsoft.NET.Sdk" >

  <Target Name="SwitchToAnyCpu" BeforeTargets="CoreCompile" >
    <Message Text="Current Platform=$(Platform)" />
    <Message Text="Current PlatformTarget=$(PlatformName)" />
    <PropertyGroup>
      <Platform>anycpu</Platform>
      <PlatformTarget>anycpu</PlatformTarget>
    </PropertyGroup>
    <Message Text="New Platform=$(Platform)" />
    <Message Text="New PlatformTarget=$(PlatformTarget)" />
  </Target>

</Project>

就我而言,我正在使用BeforeTargetsAfterTargets任务构建一个FPGA ,但是在main中编译了一个C#应用程序CoreCompile。(部分原因是我可能需要某种命令行应用程序,部分原因是我不知道如何省略或覆盖CoreCompile

要针对多个并发的二进制文件(例如x86和x64)进行构建:要么需要一个单独的手动构建任务,要么需要两个单独的项目文件,分别带有上例中的<PlatformTarget>x86</PlatformTarget><PlatformTarget>x64</PlatformTarget>设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.