Wie man ROS2 undefined reference to symbol '_ZN10tracetools6detail15demangle_symbolEPKc' behebt

Problem

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

linker_error_example.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 Ihre Anwendung ein Symbol namens tracetools::details::demangle_symbol() erfordert und dass dieses Symbol während der Link-Phase nicht gefunden wird. Mit anderen Worten, Sie müssen die Bibliothek linken, die dieses Symbol bereitstellt. In diesem Fall müssen Sie libtracetools.so mit -ltracetools linken.

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.txt
target_link_libraries(your_executable_name tracetools)

Ersetzen Sie your_executable_name durch den Namen Ihres Executable-Targets.

Falls Sie eine neue Fehlermeldung wie

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

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

CMakeLists_target_link_directories.patch
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)

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