2012-04-03 14 views
13

से सीएमकेलिस्ट फ़ाइल बनाना I C++ प्रोजेक्ट के लिए मेरी बिल्ड फ़ाइलों को उत्पन्न करने के लिए cmake का उपयोग करना चाहता हूं। मेरे पास मौजूदा Makefile है। मुझे मानक cmake सिंटैक्स का उपयोग करके Makefile उत्पन्न करने में समस्याएं आ रही हैं।मौजूदा मेकफ़ाइल

के TARGET_LINK_LIBRARIES अनुभाग में -lstdc++ -lpthread -lboost_thread-mt जैसे मानक सी ++ पुस्तकालयों को मैं कैसे शामिल करूं? या इन फ़ाइलों को ADD_DEPENDENCIES अनुभाग में शामिल किया जाना चाहिए।

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

आप add_dependencies उपयोग नहीं करना चाहिए जब आप पुस्तकालयों लिंक करना चाहते हैं:

(या) वहाँ एक सरल उपकरण है जो एक Makefile

उत्तर

9

उपयोग करने के लिए की जरूरत है। चूंकि सीएमके को सभी प्लेटफॉर्म पर चलाना है, इसलिए यह जीएनयू मेक जैसी प्लेटफॉर्म विशिष्ट धारणाओं पर भरोसा नहीं कर सकता है, जो कुछ स्थानों पर चीजों को जटिल बनाता है।

विशेष रूप से, सीएमके पुस्तकालयों का उपयोग करने के लिए एक बहुत ही शक्तिशाली और जटिल प्रणाली प्रदान करता है: आप अपनी लाइब्रेरी के नाम से find_package पर कॉल करते हैं, जो आपके सेमेक मॉड्यूल पथ से लाइब्रेरी खोज स्क्रिप्ट का आह्वान करेगा। यह स्क्रिप्ट (जिसे सीएमके में भी लिखा गया है) लाइब्रेरी के हेडर और lib फ़ाइलों के स्थान का पता लगाने और उन्हें कुछ सीएमके वैरिएबल में स्टोर करने का प्रयास करेगा, जिसे बाद में सीएमके आदेशों जैसे include_directories और target_link_libraries के पास पास किया जा सकता है।

इस दृष्टिकोण के साथ दो समस्याएं हैं: सबसे पहले, आपको एक खोज स्क्रिप्ट चाहिए। सौभाग्य से, पीएमड्रेड्स, बूस्ट और कुछ अन्य लोगों के लिए सर्च स्क्रिप्ट के साथ सीएमके जहाजों, लेकिन यदि आप अधिक विदेशी पुस्तकालय का उपयोग कर रहे हैं, तो आपको खुद को खोज स्क्रिप्ट लिखनी पड़ सकती है, जो पहले आर्केन अनुभव की तरह है ...

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

बिल्टिन स्क्रिप्ट <cmake-install-prefix>/share/cmake-2.8/Modules जैसे कहीं स्थित हैं। अपने प्रश्न के लिए, FindBoost.cmake और FindThreads.cmake फ़ाइलों को देखें (सीएमके को स्वचालित रूप से मानक लाइब्रेरी से लिंक करना चाहिए)। किसी भी कॉर्न ने बूस्ट स्क्रिप्ट का उपयोग करने के लिए पहले ही कुछ नमूना कोड दिया है, आपको जो कुछ भी जानने की जरूरत है वह सीएमके दस्तावेज में है या सीधे खोज स्क्रिप्ट फाइलों में है।

2

इस तरह से एक CMakeList.txt फ़ाइल उत्पन्न है। लिंकिंग निर्भरता का तात्पर्य है, लेकिन जब आपको लिंक करने की आवश्यकता होती है तो केवल निर्भरता पर्याप्त नहीं होगी। Makefiles से 1 रूपांतरण CMakeLists रहे हैं:

2

बूस्ट के साथ आप वास्तव में दुर्भाग्य से, वहाँ कोई सीधा 1 है पैकेज खोजक

set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1") 
    set(Boost_USE_MULTITHREADED ON) # for -mt 
    find_package(Boost COMPONENTS thread) 
    if(Boost_FOUND) 
    MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}") 
    MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}") 
    set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}") 
    else() 
    MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND") 
    endif() 

target_link_libraries(executable ${LIBRARIES})