+1 Daumen
2k Aufrufe

Ich möchte ein Projekt (CMake) erstellen.

Im Projektordner lege ich eine "build.sh" ab und lege ein Verzeichnis "src" an, in dem meine ".cpp" liegt.

Im Projektordner als auch in "src" erstelle ich eine CMakeLists.txt

Die Dateien sehen wie folgt aus:

build.sh

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

Die CMakeLists.txt im Projektordner:

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)

Die CMakeLists.txt in "src"

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})

Also ich möchte einfach ein geordnetes Projekt erstellen und die PCL Library benutzen.

Bei einem Beispielprogramm von der PLC war folgende CMakeLists.txt, die ich wie man sieht vom Prinzip in meine Dateien übernommen hab:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(bspline_fitting)

find_package(PCL 1.7 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (bspline_fitting bspline_fitting.cpp)
target_link_libraries (bspline_fitting ${PCL_LIBRARIES})

jedoch findet er die Library nicht.

Hier die letzten Zeilen von vielen bei 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


Wie binde ich die Libraries ein?

Wie gebe ich noch Argumente für den Compiler/Linker mit, das er z.B. -std=c++11 benutzen soll.

Oder wenn mein Ausführen des Programms

LD_LIBRARY_PATH=/path/:$LD_LIBRARY_PATH ./programm gebraucht wird, kann man das auch mit CMake verarbeiten, sodass man das nicht ständig beim Ausführen eintippen muss?

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Einleitung

Die Fehlersuche und das korrekte Einbinden von Libraries, speziell der PCL (Point Cloud Library) in ein CMake-Projekt, kann eine Herausforderung darstellen. Aber keine Sorge, mit ein paar Anpassungen und dem Hinzufügen einiger Zeilen in deine CMake-Dateien kannst du diese Probleme beheben. Zudem kannst du auch Compiler-Flaggen wie -std=c++11 hinzufügen und Umgebungsvariablen direkt in deinem Projekt setzen, um die Benutzung zu vereinfachen.

Library nicht gefunden Problem lösen

Die Fehlermeldungen, die du erhältst (cannot find -loptimized, cannot find -ldebug), deuten darauf hin, dass CMake während des Link-Prozesses einige Bibliotheken nicht finden kann. Dies ist oft auf ein Problem mit den Pfaden zu den PCL-Bibliotheken zurückzuführen oder darauf, dass die korrekten Link-Ziele (Namen der Bibliotheken) nicht angegeben sind.

Um das Problem zu lösen, stelle sicher, dass du in deinem CMake die richtige Version der PCL angegeben hast und die Pfade zu den Libraries korrekt konfiguriert sind. Du kannst auch die automatisch gesetzten Variablen ${PCL_LIBRARIES} überprüfen, um zu sehen, ob ihnen korrekte Werte zugewiesen wurden.

Compiler-Flaggen hinzufügen

Um C++11 in deinem Projekt zu aktivieren, kannst du set(CMAKE_CXX_STANDARD 11) zu deiner Haupt-CMakeLists.txt hinzufügen. Dies ist die empfohlene Methode, um sicherzustellen, dass dein Projekt mit dem standardmäßigen C++11-Compiler gebaut wird.

Haupt-CMakeLists.txt

cmake
cmake_minimum_required(VERSION 2.8)
project (pc)

set(CMAKE_CXX_STANDARD 11) # Setze C++ Standard

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)


src/CMakeLists.txt

Es sieht so aus, als ob du den ordnungsgemäßen Pfad zu deinen Quelldateien und die Link-Libraries korrekt eingerichtet hast. Stelle sicher, dass der Pfad zu deiner main.cpp korrekt ist. Normalerweise sollte der Pfad relativ zum src-Verzeichnis sein, also nur main.cpp, falls main.cpp direkt in src liegt.

Umgebungsvariablen in CMake setzen

Das Setzen von Umgebungsvariablen wie LD_LIBRARY_PATH direkt in CMake ist nicht die bevorzugte Methode, da es besser ist, solche Variablen in der Umgebung, in der dein Programm ausgeführt wird, zu setzen. Allerdings kannst du, wenn du es wirklich aus deinem Programm heraus machen möchtest, set(ENV{LD_LIBRARY_PATH} "/dein/pfad:$ENV{LD_LIBRARY_PATH}") in deinem CMake verwenden. Beachte jedoch, dass dies nur während der Build-Zeit deines Projekts gesetzt wird und nicht unbedingt die Ausführungszeit beeinflusst, wenn du dein Programm außerhalb von CMake ausführst.

Fazit

Um deine PCL-Libraries korrekt zu verlinken, stelle sicher, dass du alle notwendigen Pfade korrekt angegeben hast und überprüfe, ob die ${PCL_LIBRARIES}-Variable korrekt gesetzt ist. Für das Setzen des C++11 Standards und das Hinzufügen von Compiler-Flaggen kannst du set(CMAKE_CXX_STANDARD 11) verwenden. Beachte, dass das manuelle Setzen von Umgebungsvariablen wie LD_LIBRARY_PATH direkt in CMake und das Ausführen deines Programms damit nicht die beste Praxis darstellt. Es ist besser, dies außerhalb deines Build-Systems zu verwalten.
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community