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] Copyright (C) Microsoft Corporation 2007. 모든 권리 보유.

빌드 시작 1.7.2010 8:28:10. 노드 0에서 "SolutionPath \ Solution.sln"프로젝트 (타겟 재 구축). 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 : 지정된 s olution 구성 "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"가 필요하지 않습니까?
Andrew Wyatt

미래 독자들이 여기에 도착하여 Visual Studio를 설치하지 않고 컴퓨터에 2017 버전의 MSBuild를 설치하는 방법에 대해 궁금한 경우이 다른 질문을 참조하십시오 .
Wai Ha Lee

@AndrewWyatt-afaik-C ++은 현대 Win32.NET을 사용하는 동안 사용x86
Elliot Woods

@ElliotWoods-설명 다시 해 주셔서 감사합니다 : Win32 / x86-내 견해는 C ++ 관점에서만봤을 것입니다.
Andrew Wyatt

답변:


106

x86x64 용 솔루션을 빌드 하려면 두 플랫폼 모두에 대해 솔루션을 구성해야합니다. 실제로 모든 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 / 실행 파일을 작성합니다.
Benjamin Baumann

@Julien은 .targets 파일을 사용하여 공유 구성을 설정할 수 있습니까?
Jan 'splite'K.

4
예를 들어 일부 프로젝트는 생성 된 프로젝트 Win32대신 ()을 사용 합니다. x86CMakelibssh2CMake
Jeroen Wiert Pluimers

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에서 선택한 프로젝트 구성 조합에 관계없이 솔루션의 각 프로젝트마다 동일합니다.
Laurent LA RIZZA

2
또는 아마도 짧은 : / P : 구성 = 릴리스, AnyOtherParameter = ABC123, 플랫폼 = 86
granadaCoder

1
그것이 누군가에게 도움이된다면, 명령 줄의 다중 단어 인수는 큰 따옴표로 묶습니다. 그래서 Platform="Any CPU"또는 Platform="Mixed Platforms"그것을 필요로하는 사람들을 위해.
John Doe

14

명령 행에서이 작업을 수행하려고하는 경우, 기계 전체 환경 변수 '플랫폼'이 설정되어 있고 사용자를 상대로 작업하는 데 문제가있을 수 있습니다. 일반 창 명령 창 대신 VS2012 명령 창을 사용하면 이것을 재현 할 수 있습니다.

명령 프롬프트에서 다음을 입력하십시오.

플랫폼 설정

VS2012 명령 창에는 'X64'사전 설정 값이 있습니다. 내 솔루션 파일에있는 내용을 방해하는 것 같습니다.

일반 명령 창에서 'set'명령은 "변수가 정의되지 않았습니다"라는 메시지를 표시합니다.

위의 'set'명령의 결과로 환경 변수 값이 반환되지 않으면 계속 진행하십시오.


2
이것은 물론 VS2012 x64 명령 창이 VS2012 x86 명령 창과 어떻게 다른지에 대한 것입니다. 의도적으로 "간섭"이 아닌 IOW
MSalters

0

최신 핵심 라이브러리 SDK 프로젝트 파일을 사용하는 VS2017 및 2019의 경우 빌드 프로세스 중에 플랫폼을 변경할 수 있습니다. 다음 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를 짓고 있어요 BeforeTargetsAfterTargets작업하지만 주에 C #을 응용 프로그램을 컴파일 CoreCompile. (부분적으로 일종의 명령 줄 앱을 원할 수도 있고 부분적으로 생략하거나 무시하는 방법을 알 수 없기 때문에 CoreCompile)

x86 및 x64와 같은 여러 개의 동시 바이너리를 빌드하려면 별도의 수동 빌드 작업이 필요하거나 위의 예제에서 각각 <PlatformTarget>x86</PlatformTarget><PlatformTarget>x64</PlatformTarget>설정을 가진 두 개의 별도 프로젝트 파일이 필요합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.