ROS2启动时缺失共享运行库,求除LD_LIBRARY_PATH外的解决方案
问题解决:ROS2启动时找不到外部共享对象(替代LD_LIBRARY_PATH的方案)
问题背景
colcon build编译正常,但ROS2启动节点时报错找不到外部共享对象(比如libtorch),不想手动设置$LD_LIBRARY_PATH,寻求更优的路径添加方式。
当前CMake链接外部库的代码:
target_link_libraries(some_proj ${TORCH_LIBRARIES} ) install(TARGETS some_proj EXPORT export_${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION lib/${PROJECT_NAME} ) install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}/ ) ament_package()
三种更优解决方案
1. 利用ROS2环境钩子(推荐)
这是ROS2官方推荐的方式,无需用户手动配置环境变量,source setup.bash时自动加载库路径:
- 在包根目录创建
env-hooks文件夹,新建00-${PROJECT_NAME}-library-path.sh.in文件,内容:export LD_LIBRARY_PATH="@TORCH_INSTALL_PREFIX@/lib:$LD_LIBRARY_PATH" - 在CMakeLists.txt中添加安装钩子的指令:
注意:需要确保# 安装环境钩子 install( FILES env-hooks/00-${PROJECT_NAME}-library-path.sh.in DESTINATION share/${PROJECT_NAME}/env-hooks RENAME 00-${PROJECT_NAME}-library-path.sh PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )TORCH_INSTALL_PREFIX变量已正确定义(比如通过find_package(Torch REQUIRED)自动获取)。
2. 复制外部库到包的install目录
将外部动态库直接安装到ROS2包的install/lib目录(ROS2默认搜索路径),避免依赖外部路径:
- 在CMakeLists.txt中添加:
编译后,libtorch的动态库会被复制到# 安装libtorch的动态库到包的lib目录 install( DIRECTORY ${TORCH_INSTALL_PREFIX}/lib/ DESTINATION lib FILES_MATCHING PATTERN "*.so*" PATTERN "*.so.*" )install/${PROJECT_NAME}/lib,ROS2启动时会自动搜索该路径。
3. 硬编码rpath到可执行文件
通过CMake设置rpath,让可执行文件运行时自动查找外部库路径,无需环境变量:
- 在CMakeLists.txt中添加:
这种方式会把库路径直接写入可执行文件的元数据中,运行时无需依赖任何环境变量,适合需要独立运行的节点。# 设置rpath,让可执行文件运行时自动找到libtorch set(CMAKE_INSTALL_RPATH "${TORCH_INSTALL_PREFIX}/lib") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
内容的提问来源于stack exchange,提问作者mro47
相关产品推荐
相关产品推荐

