Проблема
Ви намагаєтеся скомпілювати виконуваний файл C++ за допомогою rclcpp, але під час фази компонування бачите такі повідомлення про помилки:
/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:
target_link_libraries(your_executable_name rcl)Замініть your_executable_name на ім’я вашого цільового виконуваного файлу.
Якщо ви побачите нове повідомлення про помилку, наприклад:
/usr/bin/ld: cannot find -lrcl: No such file or directoryможливо, вам потрібно додати шлях до бібліотек ROS2 у ваш CMakeLists.txt:
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)