Wie man ROS2 undefined reference to rclcpp::init behebt

Problem

Sie versuchen, eine C++-Executable mit rclcpp zu kompilieren, aber während der Link-Phase sehen Sie Fehlermeldungen wie

rclcpp-linker-error.txt
/usr/bin/ld: main.cpp:(.text+0x7b): undefined reference to `rclcpp::InitOptions::InitOptions(rcutils_allocator_s)'
/usr/bin/ld: main.cpp:(.text+0x9c): undefined reference to `rclcpp::init(int, char const* const*, rclcpp::InitOptions const&, rclcpp::SignalHandlerOptions)'
/usr/bin/ld: main.cpp:(.text+0xa8): undefined reference to `rclcpp::InitOptions::~InitOptions()'
/usr/bin/ld: main.cpp:(.text+0xdf): undefined reference to `rclcpp::spin(std::shared_ptr<rclcpp::Node>)'
/usr/bin/ld: main.cpp:(.text+0x145): undefined reference to `rclcpp::shutdown(std::shared_ptr<rclcpp::Context>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: main.cpp:(.text+0x1b1): undefined reference to `rclcpp::InitOptions::~InitOptions()'

Lösung

Im Allgemeinen bedeutet dies, dass Sie Ihr Build-System nicht korrekt konfiguriert haben. Standardmäßig erwartet ROS2, dass Sie ROS2 (und seine CMake-Makros) das Linken Ihrer Executables überlassen lassen.

Schauen Sie sich unseren Beitrag über index-symbols.py an, das ein Skript enthält, um die erforderlichen Bibliotheken für jedes fehlende Symbol zu finden.

Falls Sie jedoch Ihre Executables manuell linken möchten, müssen Sie Folgendes zu Ihrer CMakeLists.txt hinzufügen:

CMakeLists-link-rclcpp.patch
target_link_libraries(your_executable_name rclcpp)

Ersetzen Sie your_executable_name durch den Namen Ihres Executable-Targets.

Falls Sie eine neue Fehlermeldung wie

ld-cannot-find-lrclcpp.txt
/usr/bin/ld: cannot find -lrclcpp: No such file or directory

sehen, müssen Sie möglicherweise den Pfad zu den ROS2-Bibliotheken zu Ihrer CMakeLists.txt hinzufügen:

CMakeLists-add-libdir-rclcpp.patch
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)

Check out similar posts by category: ROS, C/C++