Umstieg auf cmake..



  • hallo zusammen,

    ich habe nun angefangen meine Makefile durch cmake zu generieren und muss sagen bis jetzt klappte alles wunderbar. doch nun habe ich doch eine frage:

    ich generier viel statisch libs wie z.b.

    SET(SRC_Lib1 l1.cpp l2.cpp)
    INCLUDE_DIRECTORIES(${LIB1_INCLUDE_DIR})
    ADD_LIBRARY(Lib1 STATIC ${SRC_Lib1})
    

    nun möchte ich alle statischen libs noch in eine shared lib zusammenfassen und irgendwie finde ich dazu keine passende idee. kann mir da jemand weiterhelfen?

    wäre es möglich in einem cmakefile alle anderen cmake files zu "includen" damit man dort die Variabeln kennt:
    ca so:

    add_subdirectory(lib1)
    add_subdirectory(lib2)
    SET(SRC_SharedLib ${SRC_Lib1} ${SRC_Lib2})
    INCLUDE_DIRECTORIES(${LIB1_INCLUDE_DIR})
    INCLUDE_DIRECTORIES(${LIB2_INCLUDE_DIR})
    ADD_LIBRARY(SharedLib SHARED ${SRC_Lib1})
    

    vielen dank für eure hilfe



  • ja, aber du bräuchtest die quellen und die includes nicht.

    `

    add_subdirectory(lib1)

    add_subdirectory(lib2)

    add_library (sharedlib SHARED)

    target_link_libraries (sharedlib lib1 lib2)

    `



  • Vielen Dank aber wenn ich das so mache meldet mir cmake folgendes:

    You called ADD_LIBRARY for library sharedlib without any source files.
    

    hänge mal meine Verzeichnissstrucktur noch an...

    ./project/CMakeLists.txt --> für die Sharedlibrary
    ./project/lib1/CmakeLists.txt --> für die static lib1
    ./project/lib1/CmakeLists.txt --> für die static lib2
    usw...



  • Ich möchte einfach einen Weg, dieses Problem zu lösen ohne das ich bei der shared lib nocheinmal alle Sourcen angeben muss.

    Ziel:
    Wenn z.b. lib1 ändert, muss ich nur das CMakeLists.txt file der lib1 anpassen und das von der sharedlib bleibt gleich.

    Es führen da sicher mehrere zum Ziel und so muss es nicht zwangsweise diesen sein bin da offen für weiter Möglichkeiten 😃

    Danke



  • Zur Not könnte man eine leere dummy.cpp bei der shared-lib mit angeben (die am besten vorher irgendwie mit cmake generieren).

    Alternativ die static libs nicht mit target_link_libraries dazugeben sondern mit add_library (... SHARED ${CMAKE_CURRENT_BINARY_DIR}/liblib1.a ...) (evtl. gibt es noch eine bessere Möglichkeit an den Pfad der static lib zu kommen.
    Dann muss aber cmake auch noch irgendwie gesagt werden um welche Sprache es sich bei der shared lib handelt.



  • irgendwie blicke ich da nicht mehr durch, aber ich denke viel fehlt nicht mehr 😉

    mein CMakeLists.txt:

    cmake_minimum_required(VERSION 2.6)
    
    project(shared)
    
    add_subdirectory(lib1)
    add_subdirectory(lib2)
    
    ADD_LIBRARY(mySharedLib SHARED ./lib1/liblib1.a
                                   ./lib2/liblib2.a)
    
    #ADD_LIBRARY(mySharedLib SHARED)
    
    SET_TARGET_PROPERTIES(mySharedLib PROPERTIES LINKER_LANGUAGE Cxx)
    
    #target_link_libraries(mySharedLib 
    #                      GLOBAL
    #                      AppComponent)
    

    so mekert cmake folgendes:

    Error required internal CMake variable not set, cmake may be not be built correctly.
    Missing variable is:
    CMAKE_Cxx_CREATE_SHARED_LIBRARY
    

    Kann mir jemand erklären wie ich diese Variable setzen muss? Hab leider nichts nützliches im netz gefunden. und dann hoffe ich das es dann funktionieren wird.



  • flownfluid schrieb:

    ADD_LIBRARY(mySharedLib SHARED ./lib1/liblib1.a
                                   ./lib2/liblib2.a)
    
    #ADD_LIBRARY(mySharedLib SHARED)
    			
    SET_TARGET_PROPERTIES(mySharedLib PROPERTIES LINKER_LANGUAGE Cxx)
    

    Was soll das werden, wenn es fertig ist?

    1. Du kannst keine Static Archives zu einer Shared Library zusammenlinken, zumindest nicht ohne spezielle Vorkehrungen zu treffen.
    2. Setzt man normalerweise nicht die LINKER_LANGUAGE Property, und wenn doch, dann auf CXX und nicht Cxx.

    Mach doch folgendes:

    ADD_LIBRARY(mySharedLib SHARED ${LISTE_ALLER_CPP_DATEIEN})
    


  • ...danke für deine Antwort....

    aber genau um die "liste aller cpp-files" gehts hier genau...

    Ich weiss nicht wie ich die machen kann ohne doppelt zu schreiben.

    Das heisst ich erstelle die statischen Libs lib1 und lib2.
    und nun möchte ich noch eine sharedlib kreieren, wo beide "Sachen drin" sind.

    Aber nun möchte ich gerne die Sourcen nur im cmakefile der lib1 und lib2 haben.
    Sprich wenn in lib1 ein File dazukommt, ändere ich das cmake File der lib1 und das muss reichen, sprich das cmakefile der Sharedlib sollte nicht geändert werden.

    Weiss du was ich meine?!?



  • Tipp: Erstelle Listen der Source-Files. Dann erstellst Du aus diesen Listen die jeweiligen Bibliotheken:

    set(SRC1 file11.cpp file12.cpp file13.cpp)
    add_library(lib1 STATIC ${SRC1})
    
    set(SRCA fileAA.cpp fileAB.cpp fileAC.cpp)
    add_library(libA STATIC ${SRCA})
    
    add_library(libBIG SHARED ${SRC1} ${SRCA})
    


  • PS: Mehr cmake-Tipps gibt es hier www.th-thielemann.de