Problema
Estás intentando compilar un ejecutable C++ usando rclcpp, pero durante la fase de enlazado ves mensajes de error como
/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 lineSolució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:
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
/usr/bin/ld: cannot find -lrcl: No such file or directorypuede que necesites añadir la ruta a las bibliotecas de ROS2 a tu CMakeLists.txt:
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)