Cómo solucionar ROS2 undefined reference to symbol rcl_timer_call_with_info

Problema

Estás intentando compilar un ejecutable C++ usando rclcpp, pero durante la fase de enlazado ves mensajes de error como

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

Solución

Este error simplemente significa que librcl.so requiere un símbolo llamado rcl_timer_call_with_info y que este símbolo no se encuentra durante la fase de enlazado. En otras palabras, necesitas enlazar la biblioteca que proporciona este símbolo. En este caso, necesitas enlazar librcl.so usando -lrcl.

Ten en cuenta que el mensaje de error mismo te dice qué enlazar: /opt/ros/jazzy/lib/librcl.so: DSO missing from command line, así que inmediatamente sabes qué enlazar.

Generalmente esto significa que no configuraste tu sistema de compilación correctamente. Por defecto, ROS2 espera que dejes que ROS2 (y sus macros CMake) manejen el enlazado de tus ejecutables.

Sin embargo, en caso de que quieras enlazar manualmente tus ejecutables, necesitas añadir lo siguiente a tu CMakeLists.txt:

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

Reemplaza your_executable_name con el nombre de tu ejecutable destino.

En caso de que veas un nuevo mensaje de error como

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

puede que necesites añadir la ruta a las bibliotecas de ROS2 a tu CMakeLists.txt:

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

Echa un vistazo a artículos similares por categoría: ROS C/C++