2011-12-19 15 views
20

मैं सीएमके की कमांड लाइन में प्रीप्रोसेसर मैक्रो सेट करने का प्रयास करता हूं। मैं कोशिश की है:सीएम + प्रीप्रोसेसर मैक्रो को सीएमके के साथ कमांड लाइन के माध्यम से कैसे परिभाषित किया जाए?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

लेकिन यह न तो परिभाषित किया है जब मैं संकलन और न ही मैं CMake द्वारा उत्पन्न फ़ाइलों में नाम MY_MACRO पा सकते हैं, CMakeCache.txt जहां यह रूप में मौजूद है के लिए छोड़कर:

MY_MACRO:UNINITIALIZED=1 

मैं यह कैसे कर सकता हूं? जब तक आप के लिए नहीं एक अच्छे कारण के है -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+1

यदि आपने इसे अभी हल किया है तो मुझे समाधान –

+1

@TimMeyer में दिलचस्पी होगी: नहीं। जाहिर है यह असंभव है। – ybungalobill

+0

@ybungalobill: आप कमांडलाइन से मैक्रोज़ इंजेक्ट नहीं कर सकते हैं, आप केवल मौजूदा मैक्रोज़ को संशोधित कर सकते हैं जो CMakeLists.txt में परिभाषित हैं। इसके अलावा, * सेट पैरा = -D MY_MACRO = 1 * होना चाहिए * सेट पैरा = -DMY_MACRO = 1 * – NeoH4x0r

उत्तर

6

इस प्रयास करें।

बस अपने CMakeLists.txt में निम्न पंक्ति जोड़ें:

ADD_DEFINITIONS("MY_MACRO=1") 

CMake स्विच (यह -D<name>=<value>, या /D<name>=<value> हो) की वाक्य रचना की देखभाल करेंगे।

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

एक शर्त इसके बाद:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

तो फिर तुम उस विकल्प पर cmake उपयोग करने के साथ बदल सकते हैं/कमांड लाइन के माध्यम से रवाना

+3

यह वास्तव में आधा काम करता है। यह 'CMAKE_CXX_FLAGS' के मान को ओवरराइट करता है। मैंने '-D CMAKE_CXX_FLAGS ="/DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} "' 'लेकिन' $ {CMAKE_CXX_FLAGS} 'का विस्तार नहीं किया है। कोई भी जानता है कि इसे कैसे ठीक किया जाए? – ybungalobill

+0

कमांड लाइन पर डबल-उद्धृत तारों को बाश द्वारा विस्तारित किया जाएगा। चूंकि आपके पास CMAKE_CXX_FLAGS नामक कोई पर्यावरण चर नहीं है, इसलिए बैश इसे "" तक फैलाता है, इससे पहले कि सेमेक इसे देखता है। इसके बजाय एकल उद्धरण का प्रयोग करें। – Tolli

+0

@ टोली जो काम नहीं कर रहा है। यह बैच को चर का विस्तार करने से रोकता है, लेकिन सेमेक इसे या तो विस्तारित नहीं करता है। यह सीधे संकलक के लिए शाब्दिक मूल्य '/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS} 'पास करता है। – pavon

-5

, आप ADD_DEFINITIONS(<name>=<value>[, ...]) उपयोग करना चाहिए:

+13

CMakeLists.txt को संशोधित करने के लिए कमांड लाइन समाधान के रूप में नहीं गिना जाता है। और हाँ, मेरे पास ऐसा करने का एक अच्छा कारण नहीं है। मुझे बिल्ड प्रक्रिया को स्वचालित करना है, और मुझे * स्रोतों को बदलना नहीं चाहिए। – ybungalobill

+0

अंतरिक्ष के बारे में खेद है; मैं एक कमांडलाइन समाधान जोड़ना चाहता था, लेकिन यह वह नहीं था जिसे आप ढूंढ रहे थे। फिर भी, कमांडलाइन से इसे करने से केवल आपका दिन दुखी हो जाएगा, मेरा विश्वास करो। – hiobs

+0

कभी-कभी कमांडलाइन एक गुई एप्लिकेशन से अधिक उपयोगी होती है और कभी-कभी नहीं। मैं वास्तव में नहीं सोचता कि आप कह सकते हैं कि इससे आपका दिन दुखी हो जाएगा, क्योंकि यह वास्तव में स्थिति, उपयोगकर्ता के कौशल और व्यक्तिगत वरीयता पर निर्भर करता है। – NeoH4x0r

14

एक अच्छा विकल्प एक cmake विकल्प परिभाषित करने के लिए किया जाएगा -D ध्वज। उदाहरण:

cmake -DDEFINE_MACRO=OFF .. 

यकीन है कि संकलक परिभाषा सही प्राप्त कर रहा है बनाने के लिए, आप वर्बोज़ मोड में बनाने के लिए और मैक्रो के लिए जाँच कॉल कर सकते हैं परिभाषित किया जा रहा है या नहीं:

make VERBOSE=1 

यह एक अच्छा समाधान भी है क्योंकि make आपके कोड को फिर से संकलित करेगा जब सेमेक विकल्पों में से कोई भी बदलता है।

+2

इसके लिए सीएमकेलिस्ट की संशोधनों की आवश्यकता है, इसलिए यह समाधान नहीं है (-1)। – ybungalobill

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