2012-03-12 11 views
11

मैं सिर्फ सीएमके के साथ खेलना शुरू कर रहा हूं।एकाधिक पुस्तकालयों और निष्पादन योग्य के लिए CMakeLists.txt फ़ाइलें

/DEV 
|-- lib1 
     | CMakeLists.txt 

|-- lib2 
     | CMakeLists.txt 

|-- exe1 
     | CMakeLists.txt 

/BUILD 
|-- lib1 
|-- lib2 
|-- exe1 

/INSTALL 
|-- include 
|-- lib 
|-- bin 

मैं चाहते हैं:

  • बिल्ड प्रत्येक lib और exe स्वतंत्र रूप से जब जरूरत मैं की तरह कुछ है। (इसलिए मुझे लगता है कि मुझे प्रत्येक lib और exe के लिए एक CMakeLists.txt फ़ाइल जोड़नी होगी);
  • जब इमारत, शामिल और lib निर्देशिका निर्देशिका को संदर्भित करना चाहिए; (क्या यह एक अच्छा विचार है?)
  • बिल्डिंग करते समय, अन्य lib के लिए निर्भरता जोड़ें और यदि अद्यतित नहीं है तो उन्हें पुनर्निर्माण करें।

मैं कहाँ शुरू करने के लिए किसी भी सुराग नहीं है। कृपया मदद ...

+0

तीरोडर्स के अलावा उत्कृष्ट उत्तर: एक एकल lib बनाएँ, स्वतंत्र रूप से exe भी lib और कॉल बनाने/msbuild के लिए जेनरेट बिल्ड-डीआईआर में cd'ing द्वारा किया जा सकता है। जैसे विजुअल स्टूडियो के साथ, सेमेक प्रत्येक lib/exe के लिए एक समाधान फ़ाइल उत्पन्न करेगा यदि उस lib/exe के पास एक परियोजना() कमांड –

उत्तर

11

आप लक्ष्यों को स्वतंत्र रूप से निर्माण करने के लिए अलग-अलग CMakeLists.txt जरूरत नहीं है। आप एक शीर्ष स्तर CMakeLists.txt के साथ कहते हैं:

ADD_LIBRARY(lib1 ${all_lib1_files}) 
ADD_LIBRARY(lib2 ${all_lib2_files}) 
ADD_EXECUTABLE(exe1 ${all_exe1_files}) 
TARGET_LINK_LIBRARIES(lib2 lib1) # lib2 now depends on lib1 
TARGET_LINK_LIBRARIES(exe1 lib2) # exe1 now depends on lib2 and lib1 

तो फिर तुम निर्माण सिर्फ make lib1 या msbuild lib1.vcxproj, आदि चलाकर lib1 आप लक्ष्य के अनुसार अलग-अलग CMakeLists.txt फ़ाइलों होने से ही प्राप्त कर सकते हैं कर सकते हैं - यह पर निर्भर है अगर आपको लगता है कि यह इसके लायक है।

अपनी परियोजना FIND_LIBRARY या FIND_PACKAGE, तो वे पुनर्निर्माण किया नहीं होगा का उपयोग कर अगर वे तारीख तक नहीं कर रहे हैं इन लक्ष्यों का आयात करता है। अंत में, अगर आप चाहते हैं बाहर के तारीख निर्भरता अपने आप फिर जाए, तो आप CMake स्रोतों और निर्भर लक्ष्य के लिए नियमों के बारे में बताने की आवश्यकता है, अर्थात CMakeLists.txt फ़ाइल ADD_LIBRARY या ADD_EXECUTABLE का उपयोग कर लक्ष्य को शामिल किया है की जरूरत है।

आपको इंस्टाल निर्देशिका को संदर्भित करने की आवश्यकता नहीं है (INSTALL आज्ञाओं को छोड़कर), क्योंकि सीएमके लक्ष्य को जोड़ने के दौरान स्थापित स्थानों की बजाय libs/exes बिल्ड स्थानों का पूरी तरह से उपयोग करेगा।

+0

मेरे लिए एक बेहतर समाधान प्रतीत होता है। क्या मुझे शीर्ष स्तर पर CMakeLists.txt फ़ाइल डालना चाहिए या क्या मैं प्रत्येक निष्पादन योग्य फ़ोल्डर में ऐसी फ़ाइल डाल सकता हूं? या क्या कुछ "रिकर्सिव जादू" है I ध्यान में रखना चाहिए? धन्यवाद! – Korchkidu

+2

अपने प्रोजेक्ट की रूट में अपना मुख्य CMakeLists.txt रखना सामान्य है। अगर आप चाहते हैं, तो आप प्रत्येक exe फ़ोल्डर में CMakeLists.txt फ़ाइलों को जोड़ सकते हैं और फिर इनमें से प्रत्येक को 'शामिल करें'। 'शामिल करें' कमांड इनलाइन चलाता है, इसलिए इन अधीनस्थ CMakeLists.txt फ़ाइलों को पूरी तरह से स्टैंडअलोन होने की आवश्यकता नहीं है (यानी उन्हें 'प्रोजेक्ट' कमांड आदि की आवश्यकता नहीं है), वे अलग-अलग अलग होने का एक तरीका बनेंगे परियोजना के कुछ हिस्सों और शीर्ष-स्तरीय फ़ाइल क्लीनर को रखते हुए। प्रत्येक में केवल 'SET (all_exe1_files ...) ',' ADD_EXECUTABLE (exe1 $ {all_exe1_files}) 'और' SET_TARGET_PROPERTIES (exe1 ...) 'हो सकता है। – Fraser

+0

बढ़िया! आपका बहुत बहुत धन्यवाद! – Korchkidu

3

करने के लिए

बिल्ड प्रत्येक lib और exe स्वतंत्र रूप से जब जरूरत।

सिर्फ add_executable() या add_library() कॉल में EXCLUDE_FROM_ALL कीवर्ड जोड़ें।

जब निर्माण, शामिल हैं और lib निर्देशिका इन्सटाल निर्देशिका का उल्लेख होना चाहिए

referencing द्वारा आप तो यह अच्छा नहीं है include_directories() और link_directories() में जोड़ने से मतलब है। उपयोगकर्ता प्रणाली पर आवश्यक फाइलों के स्थान पर जोर देना बेहतर नहीं है। find_package(), find_library() या find_file() का उपयोग करके आवश्यक शामिल और पुस्तकालयों का पता लगाने का उचित तरीका है। यदि आप पहले फ़ंक्शन का उपयोग करना चाहते हैं, तो आपको FindYourLib.cmake लिखना होगा और इसे लाइब्रेरी के साथ ही इंस्टॉल करना होगा।

जब निर्माण, अन्य lib के लिए उनकी निर्भरता जोड़ने और उन्हें नहीं तो तारीख

यह CMake द्वारा स्वचालित रूप से किया जाता है अप करने के लिए फिर से बनाना। निर्भरता add_dependencies() फ़ंक्शन या target_link_libraries() के साथ अंतर्निहित रूप से जोड़ा जा सकता है।

+0

के साथ अपना स्वयं का CMakeLists.txt है "तो यह अब अच्छा है"। क्या यह एक टाइपो या कुछ है? इसके अलावा, इंस्टाल डीआईआर में libs हमारे हैं और केवल डेवलपर्स के लिए उपलब्ध हैं। हम उन्हें वितरित नहीं करेंगे। वे स्थिर रूप से निष्पादन योग्य से जुड़े होते हैं जिन्हें संकुल द्वारा पुन: वितरित किया जाता है। इसलिए, हम सिस्टम पर हमारे पुस्तकालयों को वास्तव में "इंस्टॉल" नहीं करना पसंद करते हैं लेकिन उन्हें अलग रखते हैं। क्या यह अधिक समझ में आता है? आपके उत्तर के लिए धन्यवाद! – Korchkidu

+1

एक आयातित निर्भरता पुनर्निर्मित नहीं की जाएगी। सीएमके के दस्तावेज़ों से: "एक लक्षित लक्ष्य में शामिल निर्भरता को इसके स्थान पर पारगमन से पालन किया जाता है क्योंकि लक्ष्य स्वयं ही नहीं बनाता है।" साथ ही, 'EXCLUDE_FROM_ALL' के पास लक्ष्य को स्वतंत्र रूप से लक्षित करने के साथ कुछ भी नहीं है, यह लक्ष्य को 'ALL_BUILD' सीएमके लक्ष्य के हिस्से के रूप में बनाया जाने से रोकता है। अंत में, आपके में एक और सीएमके परियोजना शामिल करने का उचित तरीका है 'निर्भरता में निर्यात (निर्यात ...' आदेश का उपयोग करना, और फिर निर्यात में ' .cmake' फ़ाइल को 'शामिल करें'। 'Cmake - विवरण के लिए -help-command इंस्टॉल करें। – Fraser

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