2011-12-12 10 views
12

हमारे पास एक परियोजना पी (C/C++ लिनक्स पर) है जिसमें पुस्तकालय lib1, lib2, lib3 शामिल हैं।एकाधिक लाइब्रेरी CMakeLists.txt

  • lib1 स्टैंडअलोन दोनों lib1 और lib2

हम में से प्रत्येक के लिए एक निर्देशिका पी और अतिरिक्त निर्देशिका के लिए lib1

  • lib3 लिंक करने के लिए एक और सिस्टम-वाइड libs से जुड़ा हुआ है
  • lib2 लिंक हमारे libs (तो, P/lib1/, P/lib2/ ...)। प्रत्येक पुस्तकालय में भी अपने स्वयं के परीक्षण होते हैं।

    सवाल:

    • , व्यवस्थित करने के लिए कैसे करें इस परिदृश्य के लिए CMakeLists.txt?
    • क्या हमें केवल एक मास्टर build निर्देशिका या प्रत्येक lib के लिए एक बनाना चाहिए?
    • क्या हमारे पास CMakeLists.txt में STATIC vs. SHARED लिंकिंग के लिए कोई विकल्प हो सकता है?
  • उत्तर

    22

    इस मामले में, मैं एक एकल निर्माण/निर्देशिका का उपयोग करने की अनुशंसा करता हूं। सीएमके में संभावित lib1, lib2 और lib3 निर्देशिकाएं उत्पन्न होंगी।

    बनाम साझा स्थैतिक के बीच स्विच BUILD_SHARED_LIBS ध्वज का उपयोग करके किया जा सकता है (जाँच add_library प्रलेखन)

    CMakeLists.txt संगठन के संबंध में, पसंद आपकी है:

    1. आप एक एकल CMakeLists.txt बना सकता है जिसमें एकाधिक add_library प्रविष्टियां हैं। इसका लाभ यह है कि आपको एक एकल CMakeLists.txt मिलेगा, जो कुछ लोग पसंद करते हैं जब परियोजनाएं सरल होती हैं।

    2. आप अपनी परियोजना को अपने lib1, lib2 और lib3 निर्देशिकाओं पर वितरित एकाधिक CMakeLists.txt में विभाजित कर सकते हैं और add_subdirectory के साथ रूट cmakelists.txt का उपयोग कर सकते हैं। इस सेटअप का लाभ यह है कि बिल्ड-फाइलों को एक कॉल (आपके निर्माण/निर्देशिका में) के साथ उत्पन्न करना आसान होगा, लेकिन फिर आप आसानी से उदा। lib3/और कॉल/msbuild वहाँ कॉल करें। CMake यह सुनिश्चित करेंगे कि निर्भरता सही ढंग से

    उदाहरण निर्माण कर रहे हैं 1:

    project(P) 
    # Setup lib1 
    set (LIB1_SOURCES ...) # Fill in your set of source-files here... 
    add_library(lib1 ${LIB1_SOURCES}) 
    # Do similar for lib2 and lib3 
    target_link_libraries(lib2 lib1) # Indicate that lib1 is needed for lib2 
    target_link_libraries(lib3 lib1 lib2) # Indicate that lib2 and lib1 are needed for lib3 
    

    उदाहरण 2:

    project(P) 
    add_subdirectory(lib1) 
    add_subdirectory(lib2) 
    add_subdirectory(lib3) 
    

    प्रत्येक उपनिर्देशिका आप तो अपने CMakeLists.txt बारे में। जैसे lib3 के मामले में:

    project(lib3) 
    set(LIB3_SOURCES ...) # Setup the list of sources here. 
    add_library(lib3 ${LIB3_SOURCES}) 
    # You can refer to other libraries which should be available from the root cmakelists. 
    target_link_libraries(lib3 lib1 lib2) 
    
    +0

    ग्रेट, धन्यवाद। – Cartesius00

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