Problém
Pokoušíte se kompilovat C++ executable pomocí rclcpp, ale během linking fáze vidíte chybové zprávy jako
/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Řešení
Tato chyba znamená, že librcl.so vyžaduje symbol nazvaný rcl_timer_call_with_info a že tento symbol není nalezen během linking fáze. Jinými slovy, musíte linkovat knihovnu, která poskytuje tento symbol. V tomto případě musíte linkovat librcl.so pomocí -lrcl.
Poznamenejte, že samotná chybová zpráva vám říká, co linkovat: /opt/ros/jazzy/lib/librcl.so: DSO missing from command line, takže okamžitě víte, co linkovat.
Obecně to znamená, že jste nenakonfigurovali váš build systém správně. Ve výchozím nastavení ROS2 očekává, že necháte ROS2 (a jeho CMake makra) zpracovat linking vašich executables.
Nicméně v případě, že chcete manuálně linkovat vaše executables, musíte přidat následující do vašeho CMakeLists.txt:
target_link_libraries(your_executable_name rcl)Nahraďte your_executable_name názvem vašeho executable targetu.
V případě, že vidíte novou chybovou zprávu jako
/usr/bin/ld: cannot find -lrcl: No such file or directorymožná budete muset přidat cestu k ROS2 knihovnám do vašeho CMakeLists.txt:
target_link_directories(your_executable_name PUBLIC /opt/ros/jazzy/lib/)