Wie man ROS2 'undefined reference to 'rosbag2_cpp::Writer::open()'' behebt

Problem

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

rosbag2-link-error.txt
/usr/bin/ld: CMakeFiles/my_rclcpp_node.dir/main.cpp.o: in function `JointStateRecorder::JointStateRecorder()':
main.cpp:(.text._ZN18JointStateRecorderC2Ev[_ZN18JointStateRecorderC5Ev]+0x29c): undefined reference to `rosbag2_cpp::Writer::open(rosbag2_storage::StorageOptions const&, rosbag2_cpp::ConverterOptions const&)'
/usr/bin/ld: main.cpp:(.text._ZN18JointStateRecorderC2Ev[_ZN18JointStateRecorderC5Ev]+0x5a2): undefined reference to `rosbag2_cpp::Writer::create_topic(rosbag2_storage::TopicMetadata const&)'
/usr/bin/ld: CMakeFiles/my_rclcpp_node.dir/main.cpp.o: in function `JointStateRecorder::~JointStateRecorder()':
main.cpp:(.text._ZN18JointStateRecorderD2Ev[_ZN18JointStateRecorderD5Ev]+0x34): undefined reference to `rosbag2_cpp::Writer::close()'

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 librosbag2_cpp.so über -lrosbag2_cpp zu linken:

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-link-rosbag2.patch
target_link_libraries(your_executable_name librosbag2_cpp)

Ersetzen Sie your_executable_name durch den Namen Ihres Executable-Targets.

Falls Sie eine neue Fehlermeldung wie

ld-cannot-find-lrosbag2.txt
/usr/bin/ld: cannot find -lrosbag2_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-add-libdir-ros2.patch
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)

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