2011-07-31 17 views
52

मेरे पास मेरे प्रोजेक्ट रूट में एक CMakeLists.txt है और एक मेरे/src फ़ोल्डर में है।/Src फ़ोल्डर में से एक में केवल .cpp फ़ाइलों (set (SOURCEFILES main.cpp foo.cpp)) के साथ एक चर शामिल है और रूट CMakeLists.txt में मैं add_subdirectory(src) करता हूं और बाद में मैं add_executable(MyApp ${SOURCEFILES}) करता हूं।सेमेक वैरिएबल स्कोप, add_subdirectory

लेकिन cmake मुझे त्रुटि

add_executable तर्कों की गलत संख्या के साथ कहा जाता है देता है, कोई स्रोतों प्रदान की

मैं कैसे cmake मिलता है चर देखने के लिए? मैंने पढ़ा है कि cmake केवल वैश्विक चर जानता है, लेकिन यह स्पष्ट रूप से मामला नहीं है ...

उत्तर

78

set कमान के दस्तावेज में उल्लेख किया है, प्रत्येक निर्देशिका add_subdirectory साथ जोड़ा या प्रत्येक कार्य function साथ घोषित एक नई गुंजाइश पैदा करता है।

नए बच्चे के दायरे को अपने मूल दायरे से सभी परिवर्तनीय परिभाषाएं मिलती हैं। set कमांड के साथ नए बच्चे के दायरे में परिवर्तनीय असाइनमेंट केवल बच्चे के दायरे में दिखाई देंगे जब तक कि PARENT_SCOPE विकल्प का उपयोग नहीं किया जाता है।

SOURCEFILES काम अपनी परियोजना के रूट फ़ोल्डर में दृश्यमान बनाने के लिए, कोशिश:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
+2

धन्यवाद, यह इसे हल। लेकिन एक और नोट: उप निर्देशिका में अब आप केवल 'foo.cpp' के बजाय' $ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp' का उपयोग कर रहे हैं क्योंकि सेमेक अब मूल दायरे में है। – blubberbernd

+2

वैकल्पिक रूप से, आप add_subdirectory कॉल से पहले मूल CMakeLists.txt फ़ाइल में चर सेट कर सकते हैं, और इसकी परिभाषा बच्चे CMakeLists फ़ाइल को प्राप्त कर सकती है। फिर, आपको फ़ाइलों के नामों को अर्हता प्राप्त करने की आवश्यकता होगी यदि आपको उन्हें एकाधिक सीएमकेलिस्ट फ़ाइलों से संदर्भित करने की आवश्यकता है। – DLRdave

+5

आपको उप-डीआईआर/फ़ंक्शन में अपने मानों का उपयोग करने के लिए वर्तमान-दायरे में चर बनाने की आवश्यकता होगी: 'सेट (VAR मान PARENT_SCOPE); सेट (VAR $ {VAR}); ' –

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