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
/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::get_message_type_support_handlesondern
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.
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
/usr/bin/ld: cannot find -lsensor_msgs__rosidl_typesupport_cpp: 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/)