2011-12-13 6 views
9

मैं थोड़ी देर के लिए इसके साथ संघर्ष कर रहा हूं, और सेमेक के साथ मेरे रोमांच ने केवल हैकिश समाधानों का परिणाम दिया है जो मुझे यकीन है कि सही नहीं हैं।मेरे सी ++ प्रोजेक्ट को सेमेक के साथ ढांचा करने का सही तरीका?

मैं एक पुस्तकालय है कि कई फ़ाइलों के होते हैं बनाया है, इस प्रकार है:

-libfolder 
    -codepart1folder 
    -CMakeLists.txt 
    -codepart1.cpp 
    -codepart1.hpp 
    -codepart2folder 
    -codepart3folder 
    -lib.cpp 
    -lib.hpp 
    -CMakeLists.txt 

मैं एक CMakeLists पुस्तकालय (कुछ प्रयोग करने के बाद) को संकलित करने के फ़ाइल में लिखा था, और मैं एक lib.a फाइल उत्पन्न कर सकते हैं। अब मैं इस परियोजना को अन्य परियोजनाओं में लाइब्रेरी के रूप में शामिल करना चाहता हूं, और lib.hpp में इंटरफ़ेस के माध्यम से इसे एक्सेस करना चाहता हूं। निर्देशिका संरचना के संदर्भ में, और मुझे रूट रूट में CMakeLists.txt में क्या डालने की आवश्यकता है, इसे करने का सबसे अच्छा तरीका क्या है?

मेरे वर्तमान प्रयास आदेशों मेरे वर्तमान परियोजना के लिए एक सबफ़ोल्डर के रूप में -libfolder जोड़ते हैं, और जोड़ने के लिए कर दिया गया है:

include_directories(${PROJECT_SOURCE_DIR}/libfolder) 
link_directories(${PROJECT_BINARY_DIR}/libfolder) 
add_subdirectory(libfolder) 
target_link_libraries(project lib) 

जब मैं बनाने के चलाने के लिए, पुस्तकालय ठीक संकलित है, लेकिन जब project.cpp संकलित, यह शिकायत करता है कि यह codepart1.hpp नहीं ढूंढ सकता है (जो lib.hpp में शामिल है, project.cpp से शामिल है)।

मुझे संदेह है कि ऐसा करने का यह गलत तरीका है, लेकिन मैं सीएमके दस्तावेज़ों के माध्यम से नहीं जा सकता और इस तरह की परियोजनाओं को स्थापित करने के लिए एक अच्छा ट्यूटोरियल ढूंढ सकता हूं। गुरुवार को सीएमके मदद करें!

+0

शायद सेमेक प्रति-देखने के लिए बहुत उपयोगी नहीं है, लेकिन मैं सलाह देता हूं कि आप प्रीकेक पर नज़र डालें। यह परिपक्वता परिपक्वता है और इसमें सेमेक के कई फायदे हैं (एक यह है कि यह गति के साथ उठने के लिए बहुत तेजी से एक बिल्ली है, खासकर अगर आप पहले से ही लुआ जानते हैं)। आप इसे http://industriousone.com/what-premake पर देख सकते हैं। – Ylisar

+1

तो, क्या आप अपनी नई परियोजना को पहले निर्मित लाइब्रेरी का उपयोग करने के लिए सक्षम करना चाहते हैं, या आप एक प्रकार के मेटा-प्रोजेक्ट से दोनों बनाना चाहते हैं? – moooeeeep

उत्तर

2

ठीक है, तो मेरा एक सहकर्मी जो एक CMake गुरु है परामर्श करने के बाद, यह CMake लगता है कि मुझे क्या करना कोशिश कर रहा हूँ के लिए समर्थन नहीं है 3 विकल्पों के साथ एक छोड़ने:

  1. के सभी जोड़े माता-पिता परियोजनाओं पर निर्भरता CMakeLists.txt - बहुत साफ नहीं है, लेकिन यह काम करने के लिए काम मिल जाएगी। आपको प्रत्येक प्रोजेक्ट के लिए यह कोड करना होगा, जिसमें आप कोड जोड़ते हैं, और वापस जाएं और यदि आपकी लाइब्रेरी बदलती है तो चीजों को ठीक करें।

  2. अपने लाइब्रेरी हेडर साफ़ करें। यह कुछ संकलक हैकर के माध्यम से किया जाता है। विचार प्रत्येक वर्ग को आगे घोषित करना है, और केवल पॉइंटर्स या बूस्ट :: shared_ptr का उपयोग करना है, और फिर केवल सीपीपी फ़ाइल में निर्भरता शामिल करना है। इस तरह आप सभी खोज सामग्री का उपयोग कर सीपीपी फ़ाइल बना सकते हैं, और आपको केवल हेडर समेत और लाइब्रेरी से लिंक करके lib का उपयोग करने में सक्षम होने का बोनस मिलता है।

  3. बिल्ड सिस्टम में देखें। जटिल निर्भरताओं के साथ पोर्टेबल कोड और फास्ट कोड संकलन होने के कारण हल समस्या नहीं है! मेरी जांच से यह काफी जटिल साबित हुआ। मैंने अपने सहकर्मियों को निर्माण प्रणाली को अपनाने को समाप्त कर दिया, जिसे उन्होंने स्वयं सेमेक में बनाया, जो उन्होंने Google से उठाए गए चीजों का उपयोग करते हुए किया।

+0

+1, क्योंकि आपके इंटरफ़ेस को साफ करना है कि इसकी आवश्यकता नहीं है 3 rdparty शामिल-डीआईआर भी बेहतर है। –

5

एक सीएमके परियोजना को दूसरे में आयात करने का साफ तरीका find_package कमांड के माध्यम से है। पैकेज घोषणा export कमांड का उपयोग करके की जाती है। Find_package का उपयोग करने का एक लाभ यह है कि यह पैकेज की फ़ाइलों को हार्ड-कोड पथों की आवश्यकता को समाप्त करता है।

गायब एचपीपी फ़ाइल के संबंध में, आपने codepart1folder शामिल नहीं किया है, इसलिए यह पथ शामिल नहीं है।

+0

ठीक है ...इस उत्तर से यह वास्तव में मुझे स्पष्ट नहीं है कि find_package और निर्यात इस मामले में उपयोग करने के लिए सही चीजें हैं, या मैं ऐसा कैसे करूं। क्या आप कृपया विस्तृत कर सकते हैं? – dlants

+0

का उपयोग शामिल हैं _directories ($ {PROJECT_SOURCE_DIR}/libfolder/codepart1folder) – LeDYoM

1

अपनी पोस्ट को देखते हुए आप कहीं भी शामिल नहीं होने के लिए 'codepart1folder' जोड़ना प्रतीत नहीं करते हैं। आप codepart1.hpp सहित कैसे हैं:

#include <codepart1.hpp> 
#include "codepart1folder/codepart1.hpp" 

मुझे नहीं लगता कि cmake परियोजनाओं को ढांचे के लिए एक मानक स्वीकार्य तरीका है। मैंने cmake repos का एक गुच्छा देखा है और वे मतभेद हैं। व्यक्तिगत तौर पर मैं निम्न कार्य करें: .. 'mkdir निर्माण & & सीडी का निर्माण & & cmake & & मेकअप:

-project 
    CMakeLists.txt 
    -build 
    -cmake 
     OptionalCmakeModule.cmake 
    -src 
     -Main 
      Main.cpp 
      Main.hpp 
     -DataStructs 
      SomeTree.hpp 
      SomeObject.hpp 
     -Debug 
      Debug.hpp 
     -UI 
      Window.hpp 
      Window.cpp 

मूल रूप से है कि 1 निर्देशिका में सभी स्रोत कोड उदासीनता, तो आप स्रोत के बाहर एक साथ निर्माण प्रदर्शन परियोजनाओं रूट फ़ोल्डर में '।

यदि आपके पास अपने प्रोजेक्ट के हिस्से के रूप में अलग-अलग libs हैं, तो आप अपने विशिष्ट lib के लिए एक अन्य उपफोल्डर के साथ एक अलग libs निर्देशिका चाहते हैं।

मेरे पास मेरे कुछ प्रतिनिधि हैं: https://github.com/dcbishop/ यदि आप CMakeLists.txt फ़ाइलों को देखना चाहते हैं।

अपने प्रोजेक्ट संरचना के साथ मुख्य समस्याओं में है कि मैं FILE_GLOB जो जाहिरा तौर पर 'गलत' वे उठाया नहीं किया जाएगा बातें '.. cmake' तो ऐसा करने के लिए (यदि आप चलाने के बाद फ़ाइलों को जोड़ तरीका है का उपयोग कर रहे हैं मुर्गी आप एक '' बनाते हैं)।मुझे यह नहीं पता है कि ऐसा करने का 'सही' तरीका क्या है (जो मैं देख सकता हूं इसमें फाइलों की एक अलग सूची रखना शामिल है) मैं केवल 1 सीएमकेलिस्ट्सटीटी फ़ाइल का उपयोग करता हूं।

कुछ परियोजनाएं भी अपनी सीपीपी और एचपीपी फ़ाइलों को अलग निर्देशिका में अलग करना चुनती हैं। तो आपके पास एक शामिल और src फ़ोल्डर्स होंगे (कम से कम एचपीपी फ़ाइलों के लिए जो बाहरी रूप से उपयोग किए जाने का इरादा रखते हैं)। मुझे लगता है कि मुख्य रूप से उन परियोजनाओं के लिए होगा जो मुख्य रूप से बड़ी पुस्तकालय हैं। हेडर फ़ाइलों को स्थापित करना भी आसान होगा।

+0

codepart1folder libfolder के अंदर CMakeLists.txt फ़ाइल में शामिल है। प्रोजेक्ट फ़ोल्डर में CmakeLists.txt में सभी उपफोल्डर्स, शामिल और लिंक जोड़ने के लिए मुझे गलत लगता है, क्योंकि project.cpp उनमें से किसी पर निर्भर नहीं है - केवल lib.hpp करता है। अपने पेड़ में, कल्पना करें कि एक प्रोजेक्ट 2 है जो लाइब्रेरी को परिभाषित करता है और मैं प्रोजेक्ट 2 को प्रोजेक्ट के उप-भाग के रूप में उपयोग करना चाहता हूं। – dlants

+0

@ जॉन सवेज। लेकिन यह सही तरीका है ... मैं lib-project में LIB_INCLUDE_DIRS चर बनाउंगा, जिसे सीएमकेकैच में "निर्यात" किया जाता है जिसमें सभी आवश्यक निर्भर शामिल हैं-डीआईआर। फिर मान लें कि जब वेमेक-इन प्रोजेक्ट होता है तो वेरिएबल मौजूद होगा। –

+0

गीथब लिंक – hAcKnRoCk

0

आप शायद

include_directories(${PROJECT_SOURCE_DIR}/libfolder/codepart1folder) 

याद कर रहे हैं इस तरह के एक मामले में आप शामिल निर्देशिका पथ चर करने के लिए सभी फ़ोल्डर जोड़ने के लिए set(CMAKE_INCLUDE_CURRENT_DIR on) कर सकते हैं।

कमांड लाइन पर सेमेक के आउटपुट की जांच करें कि क्या सही फ़ोल्डर्स सेट हैं या नहीं। इसके अतिरिक्त आप हमेशा message() को cmake चर के लिए "प्रिंट डिबगिंग" के रूप में उपयोग कर सकते हैं। निर्देशिकाओं को शामिल करने के मामले में आपको निर्देशिका निर्देशिका को पढ़ने की आवश्यकता है ताकि यह देखने के लिए कि निर्देशिका में वास्तव में क्या है।

get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES) 
message("inc_dirs = ${inc_dirs}") 

मुझे आशा है कि इससे आपको यह पता लगाने में मदद मिलेगी कि क्या गुम है।

संपादित

मैं सिर्फ libfolder में जोड़ा codepart1folder के बारे में अपनी टिप्पणी को देखा। यह केवल libfolder के include_directory पथ में उपलब्ध है और रूट फ़ोल्डर में प्रचारित नहीं है। चूंकि codepart1.hpp शामिल है lib.hpp में मौजूद है, हालांकि आपको इसे प्रोजेक्ट पथ में भी उपलब्ध कराने की आवश्यकता है अन्यथा जब आप अपनी प्रोजेक्ट बनाते हैं तो आपको अनुपलब्ध घोषणा त्रुटियां मिलेंगी।

+0

के लिए +1 ठीक है, तो यह मेरा मुद्दा है। मुझे लगता है कि मुझे मूल परियोजना में अपने सभी सबफ़ोल्डर को फिर से शामिल नहीं करना चाहिए। lib अपने स्वयं के CMakeLists.txt के साथ कोड का स्वयं निहित टुकड़ा है, और lib.a में ठीक संकलित करता है। मैं इसे हर प्रोजेक्ट में वायरस नहीं करना चाहता हूं जिसे मैं इसका उपयोग करना चाहता हूं। – dlants

+1

फिर आपको अपने lib को सही तरीके से इंटरफ़ेस करना चाहिए। – Bort