Как мне указать платформу для MSBuild?

155

Я пытаюсь использовать MSBuild для создания решения с указанной целевой платформой (мне нужны оба бинарных файла, x86 и x64). Вот как я это попробовал:

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

Однако сборка всегда дает сбой, если платформа отличается от «Любого процессора». Что я делаю не так?

Это время вывода MSBuild печатает:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: перестроить / p: конфигурация = выпуск / p: платформа = "x86" Microsoft (R) Build Engine версии 3.5.30729.1 [ Microsoft .NET Framework, версия 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Все права защищены.

Сборка началась 1.7.2010 8:28:10. Проект «SolutionPath \ Solution.sln» на узле 0 (перестроить цели t (s)). SolutionPath \ Solution.sln: ошибка MSB4126: указана недопустимая конфигурация решения "Release | x86". Укажите допустимое значение конфигурации решения, используя свойства Configuration и Platform (например, 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" недопустима. Укажите допустимую конфигурацию решения, используя свойства Configuration и Platform (например, MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU"), или оставьте эти свойства пустыми, чтобы использовать конфигурацию решения по умолчанию.

0 Warning(s)
1 Error(s)

Прошедшее время 00: 00: 00.03

Если я пытаюсь собрать его для x86 / x64 с помощью devenv, он работает отлично, однако я пытаюсь настроить сервер сборки без установки всех необходимых версий Visual Studio. Кстати, если есть лучший бесплатный инструмент (который поддерживает .NET Framework 4), я бы хотел услышать об этом.

Давид Божьяк
источник
1
Как это терпит неудачу? Может быть, некоторые проекты не поддерживают платформу x86?
Брайан
3
Вы уверены, что вам не нужно / p: Platform = "Win32"?
Эндрю Уайетт
Для будущих читателей, желающих узнать, как установить версию MSBuild 2017 на машину без установки Visual Studio, см. Этот другой вопрос .
Вай Ха Ли
@AndrewWyatt - afaik - C ++ использует, в Win32то время как современные .NET используетx86
Эллиот Вудс
@ElliotWoods - спасибо за разъяснение: Win32 / x86 - мой взгляд был бы только с точки зрения C ++.
Эндрю Уайетт

Ответы:

106

Если вы хотите создать решение для x86 и x64 , оно должно быть настроено для обеих платформ. На самом деле у вас просто есть конфигурация 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
2
x86 создает 32-битную DLL / исполняемый файл и x64 создает 64-битную DLL / исполняемый файл.
Бенджамин Бауманн
@Julien могу / должен ли я использовать файл .targets для настройки общих конфигураций?
Ян 'сплит' К.
4
Некоторые проекты используют Win32вместо, x86например, CMakeсгенерированные делают ( libssh2использует CMake).
Йерун Wiert Pluimers
212

В MSBuild или Teamcity используйте командную строку

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

или используйте более короткую форму:

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

Однако вам все равно нужно настроить платформу в своем проекте, см. Ответ Жюльена Хорау.

Томас Кубес
источник
не реализовал под-настройку для / property для определения как конфигурации, так и платформы. Спасибо
DRapp
7
Помните, что MSBuild не рассматривает Visual Studio «Конфигурации решения», а вместо этого устанавливает свойства перед выполнением xxproj для каждого проекта решения. Платформа и конфигурация будут одинаковыми для каждого проекта решения, независимо от того, какое сочетание конфигураций проекта вы выбрали в Visual Studio.
Лоран LA RIZZA
2
Или, возможно, короче: / p: Конфигурация = Выпуск; AnyOtherParameter = Abc123; Платформа = x86
granadaCoder
1
Если это кому-нибудь поможет, аргумент с несколькими словами в командной строке будет заключен в двойные кавычки. Так Platform="Any CPU"или Platform="Mixed Platforms"для тех, кому это нужно.
Джон Доу
14

Если вы пытаетесь сделать это из командной строки, вы можете столкнуться с проблемой, когда переменная среды платформы «Платформа» устанавливается для вас и работает против вас. Я могу воспроизвести это, если я использую окно команд VS2012 вместо обычного окна команд Windows.

В командной строке введите:

установить платформу

В командном окне VS2012 у меня есть предустановленное значение «X64». Кажется, это мешает тому, что находится в моем файле решения.

В обычном командном окне команда 'set' приводит к сообщению "переменная не определена" ... что хорошо.

Если результат вашей команды 'set', приведенной выше, не возвращает значения переменной окружения, вам стоит пойти дальше.

JJMpls
источник
2
Это, конечно, то, как командное окно VS2012 x64 отличается от командного окна VS2012 x86. IOW, по замыслу, а не «вмешательство»
MSalters
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>

В моем случае, я построение FPGA с BeforeTargetsи AfterTargetsзадачами, но компиляции # приложения C в основном CoreCompile. (отчасти потому, что мне может понадобиться какое-то приложение для командной строки, а отчасти потому, что я не мог понять, как его опустить или переопределить CoreCompile)

Для того, чтобы построить для нескольких, одновременно исполняемых файлов , таких как x86 и x64: либо отдельная, ручная сборка задача была бы необходима или два отдельными файлы проект с соответствующими <PlatformTarget>x86</PlatformTarget>и <PlatformTarget>x64</PlatformTarget>настройками в примере выше.

gojimmypi
источник