मैं 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: कॉन्फ़िगरेशन = रिलीज़ / p: प्लेटफ़ॉर्म = "x86" Microsoft (R) बिल्ड इंजन 3.5.30729.1 [ Microsoft .NET फ्रेमवर्क, संस्करण 2.0.50727.3082] कॉपीराइट (C) Microsoft Corporation 2007. सभी अधिकार सुरक्षित।

बिल्ड की शुरुआत 1.7.2010 8:28:10 से हुई। प्रोजेक्ट "SolutionPath \ Solution.sln" पर नोड 0 (पुनर्निर्माण टार्गेट टी (एस))। SolutionPath \ Solution.sln: त्रुटि MSB4126: निर्दिष्ट सोल ution कॉन्फ़िगरेशन "रिलीज़ | x86" अमान्य है। कृपया कॉन्फ़िगरेशन और प्लेटफ़ॉर्म गुणों (जैसे MSBuild.exe Solution.sln / p: कॉन्फ़िगरेशन = डीबग / पी: प्लेटफ़ॉर्म = "कोई भी CPU") का उपयोग करके एक वैध समाधान c ऑनफ़िगरेशन निर्दिष्ट करें या डिफ़ॉल्ट समाधान कॉन्फ़िगरेशन का उपयोग करने के लिए उन प्रॉप रेज़ को खाली छोड़ दें। डोन बिल्डिंग प्रोजेक्ट "सॉल्यूशनपैथ \ सॉल्यूशन। एसएलएन" (पुनर्निर्माण टी अरगेट (एस)) - विफल।

निर्माण विफल।

"SolutionPath \ Solution.sln" (लक्ष्य का पुनर्निर्माण करें) (1) -> (ValidateSolutionConfiguration लक्ष्य) -> SolutionPath \ Solution.sln: त्रुटि MSB4126: निर्दिष्ट solution कॉन्फ़िगरेशन "रिलीज़"। X86 "अमान्य है। कृपया कॉन्फ़िगरेशन और प्लेटफ़ॉर्म गुणों का उपयोग करके एक वैध समाधान कॉन्फ़िगरेशन निर्दिष्ट करें (जैसे MSBuild.ex e Solution.sln / p: कॉन्फ़िगरेशन = डिबग / पी: प्लेटफ़ॉर्म = "कोई भी सीपीयू") या डिफ़ॉल्ट समाधान कॉन्फ़िगरेशन का उपयोग करने के लिए उन प्रो पेर्टीज़ रिक्त छोड़ दें।

0 Warning(s)
1 Error(s)

समय बीता 00: 00: 00.03

अगर मैं इसे x86 / x64 के लिए devenv के साथ बनाने की कोशिश करता हूं तो यह पूरी तरह से काम करता है, हालांकि मैं विजुअल स्टूडियो के सभी आवश्यक संस्करणों को स्थापित किए बिना एक बिल्ड सर्वर स्थापित करने का प्रयास कर रहा हूं। वैसे, अगर वहाँ एक बेहतर फ्री टूल है (जो .NET फ्रेमवर्क 4 का समर्थन करता है), तो मुझे इसके बारे में सुनना अच्छा लगेगा।


1
यह कैसे विफल होता है? शायद कुछ प्रोजेक्ट्स x86 प्लेटफॉर्म का समर्थन नहीं करते हैं?
ब्रायन

3
क्या आप सुनिश्चित हैं कि आपको / p: Platform = "Win32" की आवश्यकता नहीं है?
एंड्रयू व्याट

भविष्य के पाठकों के लिए यहां आ रहे हैं और सोच रहे हैं कि विज़ुअल स्टूडियो स्थापित किए बिना एक मशीन पर MSBuild का 2017 संस्करण कैसे प्राप्त किया जाए, यह अन्य प्रश्न देखें
वाई हा ली

@AndrewWyatt - afaik - C ++, Win32जबकि moden .NET का उपयोग करता हैx86
इलियट वुड्स

@ElliotWoods - स्पष्टीकरण पुनः के लिए धन्यवाद: Win32 / x86 - मेरा विचार केवल C ++ बिंदु से होगा।
एंड्रयू व्याट

जवाबों:


106

यदि आप x86 और x64 के लिए अपना समाधान बनाना चाहते हैं , तो आपके समाधान को दोनों प्लेटफार्मों के लिए कॉन्फ़िगर किया जाना चाहिए। वास्तव में आपके पास कोई भी CPU कॉन्फ़िगरेशन है।

किसी प्रोजेक्ट के लिए उपलब्ध कॉन्फ़िगरेशन की जांच कैसे करें

किसी दिए गए प्रोजेक्ट के लिए उपलब्ध कॉन्फ़िगरेशन की जांच करने के लिए, प्रोजेक्ट फ़ाइल खोलें ( *.csprojउदाहरण के लिए) और PropertyGroupदाईं ओर देखें Condition

यदि आप इसके Releaseलिए मोड में निर्माण करना चाहते हैं x86, तो आपको अपनी परियोजना फ़ाइल में ऐसा कुछ होना चाहिए:

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

Visual Studio में कॉन्फ़िगरेशन कैसे बनाएं और संपादित करें

कॉन्फ़िगरेशन प्रबंधक पैनल
(स्रोत: microsoft.com )

नया समाधान मंच बटन
(स्रोत: msdn.com )

नया समाधान मंच पैनल
(स्रोत: msdn.com )

कॉन्फ़िगरेशन कैसे बनाएं और संपादित करें (MSDN पर)


X86 या x64 का उपयोग करने में क्या अंतर है?
अकाज सूजा

2
x86 32 बिट्स dll / निष्पादन योग्य बनाता है और x64 64 बिट dlls / निष्पादन योग्य बनाता है।
बेंजामिन बाउमन

@ जूलियन क्या मुझे साझा कॉन्फ़िगरेशन की स्थापना के लिए .targets फ़ाइल का उपयोग करना चाहिए?
Jan 'splite' K.

4
कुछ परियोजनाएं उदाहरण Win32के x86लिए उपयोग CMakeकरती हैं , उत्पन्न लोग करते हैं ( libssh2उपयोग करता है CMake)।
जीरोन विर्ट प्लिमर्स 19

211

MSBuild या Teamcity में कमांड लाइन का उपयोग करें

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

या छोटे रूप का उपयोग करें:

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

हालाँकि, आपको अपने प्रोजेक्ट में वैसे भी प्लेटफ़ॉर्म स्थापित करने की आवश्यकता है, इसका जवाब जूलियन होराउ देखें।


कॉन्फ़िगरेशन और प्लेटफ़ॉर्म दोनों की पहचान करने के लिए / संपत्ति के लिए उप-सेटिंग का एहसास नहीं हुआ। धन्यवाद
DRapp

7
खबरदार कि MSBuild विजुअल स्टूडियो "समाधान कॉन्फ़िगरेशन" पर विचार नहीं करता है, बल्कि समाधान के प्रत्येक प्रोजेक्ट के लिए xxproj निष्पादित करने से पहले गुण सेट करता है। समाधान के प्रत्येक प्रोजेक्ट के लिए प्लेटफ़ॉर्म और कॉन्फ़िगरेशन एक समान होगा, चाहे आप विज़ुअल स्टूडियो में चयनित प्रोजेक्ट कॉन्फ़िगरेशन का कोई फर्क नहीं पड़ता।
लॉरेंट ला रिज़्ज़ा

2
या संभवतः छोटा: / p: कॉन्फ़िगरेशन = रिलीज़; AnyOtherParameter = Abc123; प्लेटफ़ॉर्म = x86
ग्रेनेडाकोड

1
यदि यह किसी की मदद करता है, तो कमांड लाइन पर एक मल्टीवर्ड तर्क को दोहरे उद्धरण चिह्नों के साथ लपेटा जाता है। तो Platform="Any CPU"या Platform="Mixed Platforms"उन लोगों के लिए जिन्हें इसकी आवश्यकता है।
जॉन डोए

14

यदि आप कमांड लाइन से ऐसा करने की कोशिश कर रहे हैं, तो आप एक ऐसे मुद्दे का सामना कर सकते हैं जहां आपके लिए एक मशीन-वाइड एनवायरमेंट वैरिएबल 'प्लेटफॉर्म' सेट किया जा रहा है और आपके खिलाफ काम कर रहा है। अगर मैं VS2012 कमांड विंडो का उपयोग नियमित विंडो कमांड विंडो के बजाय करता हूं, तो मैं इसे पुन: प्रस्तुत कर सकता हूं।

कमांड प्रॉम्प्ट पर:

प्लेटफ़ॉर्म सेट करें

VS2012 कमांड विंडो में, मेरे पास 'X64' प्रीसेट का मूल्य है। यह मेरी समाधान फ़ाइल में जो कुछ भी है, उसमें हस्तक्षेप करता है।

एक नियमित कमांड विंडो में, 'सेट' कमांड "चर नहीं परिभाषित" संदेश में परिणाम देता है ... जो अच्छा है।

यदि आपके 'सेट' कमांड के परिणाम का कोई पर्यावरण चर मान नहीं है, तो आपको जाने के लिए अच्छा होना चाहिए।


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>

मेरे मामले में, मैं एक FPGA के साथ BeforeTargetsऔर AfterTargetsकार्यों का निर्माण कर रहा हूं , लेकिन मुख्य में एक C # ऐप संकलित कर रहा हूं CoreCompile। (आंशिक रूप से मैं कुछ प्रकार की कमांड-लाइन ऐप चाहता हूं, और आंशिक रूप से क्योंकि मैं यह पता नहीं लगा सकता कि कैसे चूक या ओवरराइड करें CoreCompile)

या तो एक अलग, मैनुअल निर्माण कार्य की जरूरत होगी या संबंधित के साथ दो अलग-अलग प्रोजेक्ट फ़ाइलें: इस तरह के 86 और 64 के रूप में कई, समवर्ती binaries के लिए निर्माण करने के लिए <PlatformTarget>x86</PlatformTarget>और <PlatformTarget>x64</PlatformTarget>उदाहरण में सेटिंग्स, ऊपर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.