C++ Projekt mit CMake bauen



  • Hallo,
    ich möchte ein sauber geordnetes Projekt erstellen und eine Library einbinden.
    die PCL lib will ich einbinden, da hab ich einfach mal ein Beispiel von der Seite übernommen (cpp Datei + CMakeLists) - es hat funktioniert (pcl

    Nun will ich das in ein eigens Projekt einbinden, folgende Dateien hab ich erstellt:
    eine build.sh (im Projekt-Wurzelverzeichnis)

    ROOTDIR=`pwd`
    CONFIGS="release"
    
        BUILDFOLDER=$ROOTDIR/build/$CONFIG
        DISTFOLDER=$ROOTDIR/dist/$CONFIG
    
        mkdir -p $BUILDFOLDER $DISTFOLDER   
        cd $BUILDFOLDER
    
        cmake -DCMAKE_BUILD_TYPE=$CONFIG $ROOTDIR || exit 1
        make
        make install
    

    eine CMakeLists.txt im Wurzelverzeichnis

    project (pc)
    
    cmake_minimum_required(VERSION 2.8)
    
    set(INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dist/${CMAKE_BUILD_TYPE}/bin/")
    
    find_package(PCL 1.2 REQUIRED)
    find_package(Eigen3 REQUIRED)
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    add_compile_options(-Wall -Wextra)
    
    add_subdirectory(src)
    

    und im angelegtem "src" Verzeichnis

    add_executable(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")
    target_link_libraries (pc "${PCL_LIBRARIES}" Eigen3::Eigen3)
    install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_DIR})
    
    

    Jedoch werden beim kompilieren fehler geschmissen, ich denke Linkerfehler, hier ein Ausschnitt aus der Ausgabe:
    /usr/bin/ld: cannot find -loptimized
    /usr/bin/ld: cannot find -ldebug
    /usr/bin/ld: cannot find -loptimized
    /usr/bin/ld: cannot find -ldebug
    /usr/bin/ld: cannot find -loptimized
    /usr/bin/ld: cannot find -ldebug
    collect2: error: ld returned 1 exit status
    src/CMakeFiles/pc.dir/build.make:383: die Regel für Ziel „src/pc“ scheiterte
    make[2]: *** [src/pc] Fehler 1
    CMakeFiles/Makefile2:85: die Regel für Ziel „src/CMakeFiles/pc.dir/all“ scheiterte
    make[1]: *** [src/CMakeFiles/pc.dir/all] Fehler 2
    Makefile:127: die Regel für Ziel „all“ scheiterte
    make: *** [all] Fehler 2

    mit einer CMakeLists und ohne extra src ordner inkl CMakeLists gehts ja, also muss der Fehler evtl bei der "Verbindung" zwischen Root und src liegen.

    Kann mir einer helfen,

    wie binde ich Libraries ein?
    und kann man in eine CMake auch -std=c++11 einbinden?



  • @cleppo sagte in C++ Projekt mit CMake bauen:

    wie binde ich Libraries ein?

    Mit target_link_libraries(..), die du entweder direkt benennst oder über find_package(..) gefunden hast (hast Du ja im gezeigten Ausschnitt benutzt).

    @cleppo sagte in C++ Projekt mit CMake bauen:

    und kann man in eine CMake auch -std=c++11 einbinden?

    Deine Frage ist etwas komisch formuliert. Aber klar: Durch setzen von CMAKE_CXX_STANDARD.



  • modernes cmake verwendet hauptsächlich target-basierte befehle.

    schau dir dazu mal den talk von Daniel Pfeiffer auf youtube an



  • Kann mir eigentlich mal jemand erklären, warum es z.B. besser sein soll, für jedes Target einzeln anzugeben, welche Features der Sprache ich nutze, damit der C++-Standard entsprechend gesetzt wird? Ich finde es viel praktischer zu sagen, dass mein ganzes Projekt in C++14 ist, weil hier jetzt alle einen passenden Compiler zur Verfügung haben. Soll ich ansonsten, sobald ich irgendwo eine range-for-Loop reinschreibe, gleich die CMakeLists ändern, damit mindestens C++11 gewählt wird? Und wer denkt daran, das wieder aus der CMakeLists zu löschen? Da erscheint mir CMAKE_CXX_STANDARD viel sinnvoller.



  • Setz doch für alles ein default?

    if(NOT "${CMAKE_CXX_STANDARD}")
      set(CMAKE_CXX_STANDARD 14)
    endif()
    


  • danke für die Antworten, also meine CMakeLists sieht jetz wie so aus und es klappt alles

    cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
    
    project(pc)
    
    set(CMAKE_CXX_FLAGS "-std=c++11")
    
    find_package(PCL 1.7 REQUIRED)
    find_package(OpenCV 3.3.1 REQUIRED)
    find_package(Eigen3 REQUIRED)
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    find_package(Threads REQUIRED)
    
    
    include_directories(${PCL_INCLUDE_DIRS})
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    link_directories(${PCL_LIBRARY_DIRS})
    link_directories(${OpenCV_LIBRARY_DIRS})
    
    add_definitions(${PCL_DEFINITIONS})
    
    add_compile_options(-Wall -Wextra)
    
    add_executable (test main.cpp)
    target_link_libraries (test ${PCL_LIBRARIES} ${OpenCV_LIBS})
    

    Was eigentlich meine Frage war: Ich möchte jetzt die cpp Dateien in ein "src" Verzeichnis legen, wie sieht dann die CMakeList im Rootverzeichnis und im src Ordner aus ? Was muss ich hinzufügen.

    also ich add_subdirectories(src) funktioniert nicht, src wird nicht gefunden wird gesagt, obwohl der Ordner da ist.
    Und die ausführbare Datei soll in den Ordner "bin" gelegt werden.
    Kann mir einer weiterhelfen?



  • @cleppo sagte in C++ Projekt mit CMake bauen:

    Was eigentlich meine Frage war: Ich möchte jetzt die cpp Dateien in ein "src" Verzeichnis legen, wie sieht dann die CMakeList im Rootverzeichnis und im src Ordner aus ? Was muss ich hinzufügen.

    Du kannst einfach dein oben gezeigtes CMakeLists.txt anpassen:

    add_executable (test src/main.cpp)
    

    oder gleich über eine Variable:

    set(source_files
        src/main.cpp
    )
    
    add_executable (test ${source_files})
    

    add_subdirectories(...) erwartet, dass im entsprechenden Unterverzeichnis ebenfalls eine CMakeLists.txt vorliegt. Mit dem von mir gezeigten Weg ist das aber gar nicht nötig.

    Wie man das Output-Directory einstellt hättest du auch selbst Suchen können:
    https://stackoverflow.com/questions/6594796/how-do-i-make-cmake-output-into-a-bin-dir