Wie man ROS2 undefined reference to symbol 'rmw_get_serialization_format' behebt
Problem
Sie versuchen, eine C++-Executable mit rclcpp zu kompilieren, aber während der Link-Phase sehen Sie Fehlermeldungen wie
/usr/bin/ld: CMakeFiles/my_rclcpp_node.dir/main.cpp.o: undefined reference to symbol 'rmw_get_serialization_format'
/usr/bin/ld: /opt/ros/jazzy/lib/librmw_implementation.so: Fehler beim Hinzufügen von Symbolen: DSO missing from command lineLö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, Sie müssen die Bibliothek linken, die dieses Symbol bereitstellt. In diesem Fall müssen Sie librmw_implementation.so mit -lrmw_implementation 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.
Falls Sie jedoch Ihre Executables manuell linken möchten, müssen Sie Folgendes zu Ihrer CMakeLists.txt hinzufügen:
target_link_libraries(your_executable_name rmw_implementation)Ersetzen Sie your_executable_name durch den Namen Ihres Executable-Targets.
Falls Sie eine neue Fehlermeldung wie
/usr/bin/ld: cannot find -lrmw_implementation: No such file or directorysehen, müssen Sie möglicherweise den Pfad zu den ROS2-Bibliotheken zu Ihrer CMakeLists.txt hinzufügen:
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)