2015-01-22 12 views
5

मैं अपनी परियोजना के कुछ हिस्सों को चाहता हूं, जिन्हें बहुत ही कम रूप से बदला जाता है, अलग-अलग निर्देशिका में स्थिर और "स्थापित" संकलित किया जाता है। यह जरूरी है क्योंकि परियोजना के कुछ विनिर्देशों के कारण अक्सर इसे स्क्रैच से पुनः संकलित किया जाना चाहिए (संपूर्ण निर्माण निर्देशिका को हटाने के साथ)। अलग-अलग निर्देशिका में स्थिर रूप से जुड़े पुस्तकालयों को "इंस्टॉल करना" निर्माण समय को काफी कम करने की अनुमति देगा।सीएमके में एक और स्थैतिक आयातित लाइब्रेरी पर निर्भर स्थिर आयातित लाइब्रेरी को कैसे बनाया जाए?

मेरी शुरुआत में क्या था। आइए मान लें कि लीबिया बहुत ही कम हो गई है और मैं इसे एक बार स्थापित करना चाहता हूं और अधिकांश परियोजनाओं के निर्माण के दौरान पुनर्निर्माण नहीं करना चाहता हूं। लीबिया कुछ तृतीय पक्ष आयातित पुस्तकालय लिबसी पर निर्भर करता है। परियोजना में लिब भी शामिल है जो अक्सर बदलता है और लीबिया पर निर्भर करता है।

CMakeLists.tst (LibB): 
    target_link_libraries("LibB" LibA_build) 

CMakeLists.tst (LibA): 
    add_library(LibA_build ...) 
    add_library(LibC STATIC IMPORTED) 
    add_dependencies(LibA_build LibC) 

इस मामले में LibB जोड़ने हम LIBA और libc पर निर्भरता होगा दौरान। और लीब बनाने से पहले हर बार हम लीबिया का पुनर्निर्माण करेंगे।

मैं नया लक्ष्य "LIBA" (नहीं की अनावश्यक rebuilds से बचने के लिए LIBA "" LibA_build)। तो अब LibB पर निर्भर करता है "।

CMakeLists.tst (LibB): 
    target_link_libraries("LibB" LibA) 

इस नए लक्ष्य मैं आयातित पुस्तकालय के रूप में घोषित कर दिया।

CMakeLists.tst (LibA): 
    # This target is for building and installing 
    add_library(LibA_build ...) 
    SET_TARGET_PROPERTIES(LibA_build PROPERTIES OUTPUT_NAME LibA) 
    install(
    FILES /build/path/to/LibA.lib 
    DESTINATION /installed/path/to/LibA 
) 

    # This target is for linking LibA with another libraries 
    add_library(LibA STATIC IMPORTED GLOBAL) 
    set_property(TARGET LibA PROPERTY IMPORTED_LOCATION /installed/path/to/LibA) 

    add_library(LibC STATIC IMPORTED) 
    add_dependencies(LibA LibC) 

परिणाम:। अब LibB के निर्माण से पहले हम पुनर्निर्माण नहीं कर रहे हैं LIBA

समस्या: क्योंकि अब LIBA आयातित बने पुस्तकालय, सीएमके ने लीबिया पर लीबिया की निर्भरता देखने से इंकार कर दिया। वास्तव में लिब के लिए लिंकिंग निर्देश में केवल लीबिया पर निर्भरता है, लेकिन लिबसी पर नहीं है। विंडोज के तहत बिल्डिंग के मामले में यह अनसुलझे बाहरी लिंकिंग त्रुटियों की ओर जाता है।

प्रश्न: स्थैतिक आयातित लाइब्रेरी को कैसे बनाया जाए, एक अन्य स्थैतिक आयातित लाइब्रेरी पर आधारित लीबिया? इसलिए लिंकिंग के लिए लिबबी निर्देश को जोड़ने के मामले में लीबिया और लीब दोनों पर निर्भरताएं शामिल होंगी।

पीएस मुझे पता है कि इस तरह से उचित तरीका नहीं है। मैंने इसे केवल इसलिए इस्तेमाल किया क्योंकि मुझे कोई और रास्ता नहीं मिला। मैं वास्तव में सराहना करता हूं अगर आप मुझे स्थिर आयात पुस्तकालय पर इस निर्भरता को जोड़ने में मदद करते हैं या किसी अन्य तरीके से सुझाव देते हैं कि मैं भिक्षा में वर्णित समृद्ध लक्ष्य कैसे प्राप्त करूं।

+0

आप एक कस्टम लक्ष्य बना सकते हैं जो केवल 'libA' के लिए "साफ" करता है या आपकी परियोजना का जो भी विशिष्ट हिस्सा टूट जाता है और उसे लगातार खरोंच की आवश्यकता होती है। या आप मूल कारण को ठीक कर सकते हैं, जो कि तथ्य यह है कि पुनर्निर्माण को खरोंच से किया जाना चाहिए। –

+0

खैर, मैं सफाई करने के बजाय "आरएम-आरएफ *" पर अधिक भरोसा करता हूं :) वैसे भी, सुझाव के लिए धन्यवाद। – Alex

+0

मेरा मुद्दा यह है कि आप सीएमके में एक कस्टम लक्ष्य लिख सकते हैं जो आप चाहते हैं तो 'आरएम-आरएफ' चलाता है। –

उत्तर

3

जो सुविधा मैं खोज रहा था (अन्य आयात पुस्तकालयों पर स्थैतिक आयात लाइब्रेरी की निर्भरता जोड़ें) को ट्रांजिटिव लिंकिंग कहा जाता है। इसे लक्षित संपत्ति IMPORTED_LINK_INTERFACE_LIBRARIES सेट करके कार्यान्वित किया जाता है। वे कहते हैं कि यह संपत्ति वंचित है और INTERFACE_LINK_LIBRARIES का उपयोग करने की अनुशंसा की जाती है, लेकिन मेरे मामले में (cmake संस्करण 2.8.11.2) केवल IMPORTED_LINK_INTERFACE_LIBRARIES काम कर रही है।

तो LIBA के लिए CMakeLists.tst के अंत ऊपर के उदाहरण के लिए इस तरह दिखना चाहिए:

add_library(LibC STATIC IMPORTED) 
    a̶d̶d̶_̶d̶e̶p̶e̶n̶d̶e̶n̶c̶i̶e̶s̶(̶L̶i̶b̶A̶ ̶L̶i̶b̶C̶)̶ 
    set_property(TARGET LibC PROPERTY IMPORTED_LOCATION /path/to/LibC) 

    set_property(TARGET LibA PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES LibC) 

आशा इस जानकारी किसी के लिए उपयोगी होगा।

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