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 (pclNun 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 2mit 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 überfind_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 eineCMakeLists.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