Як виправити ROS2 undefined reference to symbol rcl_timer_call_with_info

Проблема

Ви намагаєтеся скомпілювати виконуваний файл C++ за допомогою rclcpp, але під час фази компонування бачите такі повідомлення про помилки:

linker-error.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

Рішення

Ця помилка просто означає, що librcl.so потребує символ під назвою rcl_timer_call_with_info, і цей символ не знайдено під час фази компонування. Іншими словами, вам потрібно скомпонувати бібліотеку, яка надає цей символ. У цьому випадку вам потрібно скомпонувати librcl.so за допомогою -lrcl.

Зверніть увагу, що саме повідомлення про помилку підказує вам, що потрібно скомпонувати: /opt/ros/jazzy/lib/librcl.so: DSO missing from command line, тож ви одразу знаєте, що скомпонувати.

Загалом це означає, що ви неправильно налаштували вашу систему збірки. За замовчуванням ROS2 очікує, що ви дозволите ROS2 (та його макросам CMake) обробляти компонування ваших виконуваних файлів.

Однак, якщо ви хочете вручну компонувати ваші виконувані файли, вам потрібно додати наступне до вашого CMakeLists.txt:

CMakeLists-link-rcl.patch
target_link_libraries(your_executable_name rcl)

Замініть your_executable_name на ім’я вашого цільового виконуваного файлу.

Якщо ви побачите нове повідомлення про помилку, наприклад:

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

можливо, вам потрібно додати шлях до бібліотек ROS2 у ваш CMakeLists.txt:

CMakeLists-add-libdir.patch
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)

Дивіться схожі статті за категоріями: ROS C/C++