2008-10-03 18 views
15

एक सी ++ फ़ाइल में, मेरे पास एक कोड है:msbuild: कमांड लाइन में एक विशिष्ट प्रीप्रोसेसर # परिभाषित करें

#if ACTIVATE 
# pragma message("Activated") 
#else 
# pragma message("Not Activated") 
#endif 

मैं msbuild कमांड लाइन के साथ इस ACTIVE को परिभाषित करना चाहता हूं।

यह कोशिश की लेकिन यह काम नहीं करता है:

msbuild /p:DefineConstants="ACTIVATE=1" 

कोई विचार?

उत्तर

-2

उत्तर है: आप

नहीं कर सकते
+0

शग, शायद यह सी ++ में नहीं है लेकिन मैट हॉवल्स ने सी # परियोजना के साथ मेरे लिए काम किया है। किसी भी कारण से नहीं सोच सकता कि यह सी ++ में काम नहीं करेगा। – blak3r

+0

यह स्वीकार्य उत्तर इतना गहरा है कि मैं इसे भी नहीं देख सकता। –

+0

@ blak3r मैट्स उत्तर सी ++ में काम नहीं करता है और यह प्रश्न विशेष रूप से सी ++ के बारे में है। और प्रोजेक्ट फ़ाइल या किसी अन्य बाहरी फ़ाइल में अतिरिक्त परिवर्तन किए बिना कमांड लाइन पर केवल झंडे जोड़ने के साथ ऐसा करने का कोई तरीका नहीं है। – Zitrax

7

मुझे लगता है कि आप चाहते हैं:

/p:DefineConstants=ACTIVATE 
+1

@Matt, मैं एक ही जवाब का सुझाव दिया और दो टिप्पणीकर्ताओं कि यह काम नहीं करता द्वारा कहा गया था। इसलिए मैं अपने उत्तर हटा दिया गया ताकि MSBuild के साथ और अधिक अनुभव के साथ अन्य लोगों के विचारों को पेश कर सकती है। –

+0

ओह और acemtp मुझे बताया कि उसने पहले से ही यह कोशिश की है और ऐसा किया है काम नहीं –

+0

वैसे यह सी # वैसे भी ठीक काम करता है ... –

-1

यह शायद होना चाहिए:

#ifdef ACTIVATE 
# pragma message("Activated") 
#else 
# pragma message("Not Activated") 
#endif 
+0

@ rdeml - अच्छा विचार। –

+1

नहीं, यह #ifdef नहीं है, यह #if है और वैसे भी, यह #ifdef के साथ भी काम नहीं करता है – acemtp

8

सी ++ परियोजनाओं (और समाधान) MSBuild वातावरण में एकीकृत नहीं कर रहे हैं (अभी तक?)। निर्माण प्रक्रिया के हिस्से के रूप में, VCBuild task कहा जाता है, जो vcbuild.exe के आसपास सिर्फ एक रैपर है।

आप किए जा सकेंगे:

  • अपने समाधान जहां ACTIVATE=1 परिभाषित किया जाएगा के लिए एक विशिष्ट विन्यास बनाते हैं, और devenv.exe साथ यह संकलन (/ProjectConfig स्विच के साथ)।
  • VCBuild task लिए अपने स्वयं के कॉल रैप करने के लिए अपने खुद के लक्ष्य फ़ाइल बनाने (अवहेलना पैरामीटर देखें) ...
  • उपयोग vcbuild.exe बजाय MSBuild.exe। (vcbuild.exe में ओवरराइड पैरामीटर के बराबर प्रतीत नहीं होता है)।

ध्यान दें कि आपका समाधान सी # परियोजनाओं के लिए काम नहीं करेगा जब तक कि आप अपनी परियोजना फ़ाइलों को थोड़ा सा नहीं बदल देते। इस तरह

<PropertyGroup Condition=" '$(MyConstants)' != '' "> 
    <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> 
</PropertyGroup>
  • कॉल MSBuild:

    • <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> को कॉल करने से पहले निम्न कोड जोड़ें:
    msbuild /p:MyConstants="ACTIVATE=1"
    संदर्भ के लिए, मैं यह कैसे करना होगा है
+0

मैं msbuild.exe के बजाय vcbuild.exe का उपयोग कर सकता हूं लेकिन सवाल वही है। Vcbuild कमांड लाइन में एक विशिष्ट प्रीप्रोसेसर कैसे सेट करें? – acemtp

+0

आप सही हैं: मैंने गलत तरीके से माना है कि vcbuild.exe के पास VCBuild कार्य के रूप में पैरामीटर का एक ही सेट था। उत्तर अपडेट किया गया। प्रोजेक्ट-स्क्रिप्ट पैच – Mac

+0

+1, यही मेरी इच्छा है। – quetzalcoatl

0

मुझे यह भी करने की ज़रूरत है - मेरे ऐप के दो अलग-अलग संस्करणों को बनाने में सक्षम होने के लिए और VCBUILD का उपयोग करके बिल्ड को स्क्रिप्ट करने में सक्षम होना चाहता था। वीसीबीयूआईएलडीडी में कमांड लाइन स्विच ओवरराइड है, लेकिन मुझे यकीन नहीं है कि इसका उपयोग # डिफाईन सिग्नल को संशोधित करने के लिए किया जा सकता है जिसे तब #if सशर्त संकलन का उपयोग करके परीक्षण किया जा सकता है।

जिस समाधान के साथ मैं कैमरे को जोड़ता हूं वह एक हेडर फ़ाइल बनाने के लिए एक सरल उपयोगिता लिखना था, जिसने पर्यावरण चर के राज्य के आधार पर प्रतीक निर्धारित किया और पूर्व-निर्माण चरण से उपयोगिता को चलाया। VCBUILD चरण के प्रत्येक निष्पादन से पहले स्क्रिप्ट पर्यावरण चर सेट करता है और ऐप में एक फ़ाइल को "स्पर्श" करता है ताकि यह सुनिश्चित किया जा सके कि प्रीबिल्ड चरण निष्पादित किया गया हो।

हां, यह एक बदसूरत हैक है, लेकिन यह सबसे अच्छा था जिसके साथ मैं आ सकता था!

23

मैं पार्टी के लिए थोड़ा देर हो चुकी हूं (केवल 4 साल या उससे भी अधिक), लेकिन मुझे बस एक परियोजना पर इस समस्या का समाधान करना पड़ा, और समाधान खोजने के दौरान इस सवाल पर ठोकर खाई। हमारा समाधान दृश्य स्टूडियो में अतिरिक्त विकल्प बॉक्स के साथ संयुक्त पर्यावरण चर का उपयोग किया गया था।

  1. दृश्य स्टूडियो में, इस परियोजना के तहत अतिरिक्त विकल्प, एक वातावरण चर मैक्रो, $ (ExternalCompilerOptions) जोड़ने के विकल्प> C/C++ -> कमांड लाइन (दोनों डीबग याद है और कॉन्फ़िगरेशन रिलीज)
  2. सेट =/DFOO/DBAR> सेट ExternalCompilerOptions
    ग: पूर्व MSBuild बुला

    ग वातावरण चर> MSBuild

मद # 1 समाप्त होता है ऊपर vcxproj फ़ाइल में इस तरह लग रही:

<ClCompile> 
    <AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions> 
</ClCompile> 

यह वी.एस. 2010 के साथ मेरे लिए काम करता हम विभिन्न निर्माण स्क्रिप्ट से MSBuild ड्राइव है, तो कुरूपता एक सा छिपा हुआ है। ध्यान दें कि यदि आपने विशिष्ट मान (/ DACTIVATE = 1) को परिभाषित करने की आवश्यकता होती है तो यह परीक्षण नहीं करता है। मुझे लगता है कि यह काम करेगा, लेकिन मैं वहां 'एकाधिक' होने के बारे में चिंतित हूं।

एच^2

+0

देर से उत्तर के लिए धन्यवाद :) – acemtp

+0

संसाधन फ़ाइलों के निर्माण के दौरान परिभाषित करने के लिए, कॉन्फ़िगरेशन गुणों के अंतर्गत अतिरिक्त विकल्प भी सेट करें -> संसाधन -> कमांड लाइन – Rado

7

आप कुछ निरंतर (सिर्फ सच नहीं/गलत), आप इसे निम्नलिखित तरीके से कर सकते हैं परिभाषित करने के लिए की जरूरत है:

कमांड लाइन पर:

MSBuild /p:MyDefine=MyValue 

में vcxproj फ़ाइल (खंड < क्लोकोम्पाइल > और/या < संसाधन कॉम्पाइल >, जहां आपको इसकी आवश्यकता है, इस पर निर्भर करता है):

<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions> 
0

वीएस -2010 और ऊपर के लिए, मेरे समाधान here को ऐसे समाधान के लिए देखें, जिसके लिए मूल प्रोजेक्ट फ़ाइल में कोई संशोधन की आवश्यकता नहीं है।

0

जैसा कि @ bigh_29 ने प्रीप्रोसेसर को परिभाषित या परिभाषित करने के लिए पर्यावरण चर का उपयोग करके उल्लेख किया है।

प्रीप्रोसेसर को परिभाषित करने का तरीका उन्होंने वास्तव में /U सक्रिय किया है।

इस तरह, किसी भी प्रीप्रोसेसर से मिलान करने वाले गतिविधि को अस्वीकार कर दिया जाएगा और कंपाइलर आपके #if सक्रिय #endif संलग्नक के माध्यम से नहीं जायेगा।

0

शायद पुराने प्रश्न का उत्तर देना एक बुरा विचार है, लेकिन हाल ही में मैंने इसी तरह की समस्या को हल किया और इस विषय को पाया। मैंने कुछ बिल्ड सिस्टम के लिए एक cmd स्क्रिप्ट लिखी और मैं समाधान ढूंढने में सफल रहा।मैं इसे यहाँ भविष्य की पीढ़ियों (के लिए छोड़:

@ acemtp की समस्या के अनुसार, मेरी समाधान इस प्रकार दिखाई देगा:

@echo off 

:: it is considered that Visual Studio tools are in the PATH 
if "%1"=="USE_ACTIVATE_MACRO" (
    :: if parameter USE_ACTIVATE_MACRO is passed to script 
    :: the macro ACTIVATE will be defined for the project 
    set CL=/DACTIVATE#1 
) 
call msbuild /t:Rebuild /p:Configuration=Release 

युपीडी: मैं set CL=/DACTIVATE=1 का उपयोग करने की कोशिश की और यह भी काम किया, लेकिन official documentation करने की सिफारिश का उपयोग संख्या चिह्न

संबंधित मुद्दे