Wie man ROS2 undefined reference to rosidl_message_type_support_t behebt

Problem

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

ros2_undefined_reference_error.txt
/usr/bin/ld: CMakeFiles/my_rclcpp_node.dir/main.cpp.o: in function `rclcpp::Serialization<sensor_msgs::msg::JointState_<std::allocator<void> > >::Serialization()':
main.cpp:(.text._ZN6rclcpp13SerializationIN11sensor_msgs3msg11JointState_ISaIvEEEEC2Ev[_ZN6rclcpp13SerializationIN11sensor_msgs3msg11JointState_ISaIvEEEEC5Ev]+0x16): undefined reference to `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::JointState_<std::allocator<void> > >()'

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.

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

Beachten Sie, dass die erforderliche Bibliothek spezifisch für die von Ihnen verwendete Nachricht ist, also nicht einfach nur

rosidl_typesupport_cpp.txt
rosidl_typesupport_cpp::get_message_type_support_handle

sondern

rosidl_typesupport_cpp_sensor_msgs.txt
rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::JointState...

Im Allgemeinen können Sie sich jedoch merken, die Bibliothek für den Nachrichtentyp aus der Fehlermeldung plus __rosidl_typesupport_cpp zu linken.

In diesem Fall stammt die Nachricht von sensor_msgs, daher ist der Bibliotheksname sensor_msgs__rosidl_typesupport_cpp.

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.

CMakeLists_target_link_libraries.txt
target_link_libraries(your_executable_name sensor_msgs__rosidl_typesupport_cpp)

Ersetzen Sie your_executable_name durch den Namen Ihres Executable-Targets.

Falls Sie eine neue Fehlermeldung wie

ros2_undefined_reference_error_2.txt
/usr/bin/ld: cannot find -lsensor_msgs__rosidl_typesupport_cpp: 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.txt
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)

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