ฉันจะระบุแพลตฟอร์มสำหรับ 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: การสร้างใหม่ / p: การกำหนดค่า = Release / p: แพลตฟอร์ม = "x86" เครื่องมือสร้างรุ่น Microsoft (R) 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 (สร้างใหม่ targe t) SolutionPath \ Solution.sln: ข้อผิดพลาด MSB4126: การกำหนดค่า Sol ution ที่ระบุ "Release | x86" ไม่ถูกต้อง โปรดระบุวิธีแก้ไขปัญหาที่ถูกต้องเมื่อใช้คุณสมบัติการกำหนดค่าและแพลตฟอร์ม (เช่น MSBuild.exe Solution.sln / p: การกำหนดค่า = Debug / p: แพลตฟอร์ม = "CPU ใด ๆ ") หรือปล่อยให้ prope rties ว่างไว้เพื่อใช้การกำหนดค่าเริ่มต้น เสร็จสิ้นการสร้างโครงการ "SolutionPath \ Solution.sln" (สร้างใหม่อีกครั้ง) - ล้มเหลว

สร้างล้มเหลว

"SolutionPath \ Solution.sln" (สร้างเป้าหมายใหม่) (1) -> (เป้าหมาย ValidateSolutionConfiguration) -> SolutionPath \ Solution.sln: ข้อผิดพลาด MSB4126: การกำหนดค่า olution ที่ระบุ "Release | x86" ไม่ถูกต้อง โปรดระบุการกำหนดค่าโซลูชันที่ถูกต้องโดยใช้คุณสมบัติการกำหนดค่าและแพลตฟอร์ม (เช่น MSBuild.ex e Solution.sln / p: การกำหนดค่า = ดีบั๊ก / p: แพลตฟอร์ม = "CPU ใด ๆ ") หรือปล่อยให้ค่ากำหนดเวลาเริ่มต้นว่างเปล่า

0 Warning(s)
1 Error(s)

เวลาผ่านไป 00: 00: 00.03

ถ้าฉันพยายามที่จะสร้างสำหรับ x86 / x64 ด้วย devenv มันทำงานได้อย่างสมบูรณ์แบบ แต่ฉันพยายามที่จะติดตั้ง build server โดยไม่ต้องติดตั้ง Visual Studio รุ่นที่จำเป็นทั้งหมด โดยวิธีการถ้ามีเครื่องมือฟรีที่ดีกว่า (ที่รองรับ. NET Framework 4) ออกมีฉันชอบที่จะได้ยินเกี่ยวกับมัน


1
มันล้มเหลวอย่างไร บางทีบางโปรเจ็กต์ไม่รองรับแพลตฟอร์ม x86?
Brian

3
คุณแน่ใจหรือว่าไม่ต้องการ / p: Platform = "Win32"
Andrew Wyatt

เพื่อให้ผู้อ่านได้รับในอนาคตนี่และสงสัยว่าจะได้รับรุ่น 2017 ของ MSBuild ติดตั้งในเครื่องได้โดยไม่ต้องติดตั้ง Visual Studio, เห็นนี้คำถามอื่น
Wai Ha Lee

@AndrewWyatt - afaik - C ++ ใช้Win32ในขณะที่ moden .NET ใช้x86
Elliot Woods

@ElliotWoods - ขอบคุณสำหรับการชี้แจงใหม่: Win32 / x86 - มุมมองของฉันจะได้รับจากมุมมอง C ++ เท่านั้น
Andrew Wyatt

คำตอบ:


106

หากคุณต้องการสร้างโซลูชันของคุณสำหรับx86และx64โซลูชั่นของคุณจะต้องกำหนดค่าสำหรับแพลตฟอร์มทั้งสอง ที่จริงคุณเพิ่งมีการกำหนดค่าCPU ใด ๆ

วิธีตรวจสอบการกำหนดค่าที่มีสำหรับโครงการ

ในการตรวจสอบการตั้งค่าที่พร้อมใช้งานสำหรับโครงการที่กำหนดให้เปิดแฟ้มโครงการ ( *.csprojตัวอย่าง) และมองหามีสิทธิPropertyGroupCondition

หากคุณต้องการสร้างใน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 / executable และ x64 สร้าง 64 บิต dll / ปฏิบัติการ
Benjamin Baumann

@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

อย่างไรก็ตามคุณต้องตั้งค่าแพลตฟอร์มในโครงการของคุณดูคำตอบของ Julien Hoarau


ไม่ได้ตระหนักถึงการตั้งค่าย่อยสำหรับ / property เพื่อระบุทั้งการกำหนดค่าและแพลตฟอร์ม ขอบคุณ
DRapp

7
ระวังว่า MSBuild จะไม่พิจารณา Visual Studio "การกำหนดค่าโซลูชัน" แต่จะตั้งค่าคุณสมบัติก่อนดำเนินการ xxproj สำหรับแต่ละโครงการของโซลูชัน แพลตฟอร์มและการกำหนดค่าจะเหมือนกันสำหรับแต่ละโครงการของโซลูชันไม่ว่าคุณจะเลือกการกำหนดค่าโครงการใน Visual Studio
Laurent LA RIZZA

2
หรืออาจสั้นกว่า: / p: การกำหนดค่า = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
ถ้ามันช่วยทุกคนอาร์กิวเมนต์หลายคำในบรรทัดคำสั่งจะถูกห่อด้วยเครื่องหมายคำพูดคู่ ดังนั้นPlatform="Any CPU"หรือPlatform="Mixed Platforms"สำหรับผู้ที่ต้องการมัน
John Doe

14

หากคุณพยายามทำสิ่งนี้จากบรรทัดคำสั่งคุณอาจประสบปัญหาที่ตัวแปรสภาพแวดล้อมทั่วทั้งเครื่องกำลังถูกตั้งค่า 'แพลตฟอร์ม' ให้คุณและทำงานกับคุณ ฉันสามารถทำซ้ำได้ถ้าฉันใช้หน้าต่างคำสั่ง VS2012 แทนที่จะเป็นหน้าต่างคำสั่งปกติของ Windows

ที่พรอมต์คำสั่งพิมพ์:

ตั้งแพลตฟอร์ม

ในหน้าต่างคำสั่ง VS2012 ฉันมีค่าที่ตั้งไว้ล่วงหน้าเป็น 'X64' ที่ดูเหมือนจะรบกวนสิ่งที่อยู่ในไฟล์โซลูชันของฉัน

ในหน้าต่างคำสั่งปกติคำสั่ง '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 # app CoreCompileในหลัก (ส่วนหนึ่งอาจเป็นเพราะฉันต้องการแอพบรรทัดคำสั่งบางส่วนและส่วนหนึ่งเป็นเพราะฉันไม่สามารถหาวิธีละเว้นหรือลบล้างCoreCompile)

หากต้องการสร้างสำหรับหลาย ๆ ไบนารีที่เกิดขึ้นพร้อมกันเช่น x86 และ x64: จำเป็นต้องมีภารกิจการสร้างด้วยตนเองที่แยกต่างหากหรือไฟล์โครงการแยกต่างหากสองไฟล์ที่เกี่ยวข้อง<PlatformTarget>x86</PlatformTarget>และ<PlatformTarget>x64</PlatformTarget>การตั้งค่าในตัวอย่างด้านบน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.