Як вказати платформу для 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] Авторські права (C) Microsoft Corporation 2007. Усі права захищені.

Будівництво розпочато 1.7.2010 8:28:10. Проект "SolutionPath \ Solution.sln" у вузлі 0 (Перебудувати цільовий t (s)). SolutionPath \ Solution.sln: помилка MSB4126: Вказана конфігурація рішення "Release | x86" недійсна. Будь ласка, вкажіть дійсне рішення c налаштування, використовуючи властивості конфігурації та платформи (наприклад, MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Будь-який процесор") або залиште ці властивості порожніми, щоб використовувати конфігурацію рішення за замовчуванням. Виконано проект побудови "SolutionPath \ Solution.sln" (Перебудувати t arget (s)) - НЕПРАВНО.

Побудувати не вдалося.

"SolutionPath \ Solution.sln" (Перебудувати ціль) (1) -> (ValidateSolutionConfiguration target) -> SolutionPath \ Solution.sln: помилка MSB4126: Вказана конфігурація slution "Release | x86" недійсна. Укажіть дійсну конфігурацію рішення, використовуючи властивості конфігурації та платформи (наприклад, MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Будь-який процесор") або залиште ці особи порожніми, щоб використовувати конфігурацію рішення за замовчуванням.

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той час як moden .NET використовуєx86
Elliot Woods

@ElliotWoods - дякую за уточнення щодо: Win32 / x86 - мій погляд був би лише з точки зору C ++.
Ендрю Віатт

Відповіді:


106

Якщо ви хочете побудувати своє рішення для x86 та x64 , ваше рішення має бути налаштоване для обох платформ. Насправді у вас просто будь- яка конфігурація процесора .

Як перевірити доступну конфігурацію для проекту

Щоб перевірити доступну конфігурацію для певного проекту, відкрийте файл проекту ( *.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 для налаштування спільних конфігурацій?
Jan 'splite' K.

4
Деякі проекти використовують Win32замість, x86наприклад, CMakeзгенерованих - це ( libssh2використовує CMake).
Jeroen Wiert Pluimers

211

У MSBuild або Teamcity використовуйте командний рядок

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

або скористайтеся коротшою формою:

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

Однак вам все одно потрібно створити платформу у вашому проекті, дивіться відповідь Жульєна Хоарау.


не усвідомив підзадачу для / властивості для ідентифікації конфігурації та платформи. Спасибі
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". Це, здається, заважає тому, що є у моєму файлі рішення.

У звичайному вікні Command команда 'set' приводить до повідомлення "змінної не визначено" ... що добре.

Якщо результат вашої команди 'set' вище не повертає значення змінної середовища, вам слід добре пройти.


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>налаштуваннями у наведеному вище прикладі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.