Wie man ROS2 undefined reference to symbol rcl_timer_call_with_info behebt

Problem

Du versuchst, eine C++-Executable mit rclcpp zu kompilieren, aber während der Link-Phase siehst du Fehlermeldungen wie

linker-error.txt
/usr/bin/ld: CMakeFiles/my_rclcpp_node.dir/main.cpp.o: undefined reference to symbol 'rcl_timer_call_with_info'
/usr/bin/ld: /opt/ros/jazzy/lib/librcl.so: error adding symbols: DSO missing from command line

Lösung

Dieser Fehler bedeutet einfach, dass librcl.so ein Symbol namens rcl_timer_call_with_info erfordert und dass dieses Symbol während der Link-Phase nicht gefunden wird. Mit anderen Worten, du musst die Bibliothek linken, die dieses Symbol bereitstellt. In diesem Fall musst du librcl.so mit -lrcl linken.

Beachte, dass die Fehlermeldung selbst dir sagt, was zu linken ist: /opt/ros/jazzy/lib/librcl.so: DSO missing from command line, sodass du sofort weißt, was zu linken ist.

Im Allgemeinen bedeutet dies, dass du dein Build-System nicht korrekt konfiguriert hast. Standardmäßig erwartet ROS2, dass du ROS2 (und seine CMake-Makros) das Linken deiner Executables überlassen lässt.

Falls du jedoch deine Executables manuell linken möchtest, musst du Folgendes zu deiner CMakeLists.txt hinzufügen:

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

Ersetze your_executable_name durch den Namen deines Executable-Targets.

Falls du eine neue Fehlermeldung wie

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

siehst, musst du möglicherweise den Pfad zu den ROS2-Bibliotheken zu deiner CMakeLists.txt hinzufügen:

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

Ähnliche Beiträge nach Kategorie: ROS C/C++