c++ - ROS catkin build - 找不到共享库
问题描述
我正在尝试构建这个 ROS 包https://github.com/toddhester/rl-texplore-ros-pkg但它无法构建 'rl_experiment' 并出现以下错误:
/usr/bin/ld: cannot find -lagentlib
/usr/bin/ld: cannot find -lenvlib
collect2: error: ld returned 1 exit status
我正在使用 ROS Kinetic。共享库确实存在于文件夹 /texplore/devel/.private/rl_env/lib/ 和 /texplore/devel/.private/rl_agent/lib/ 中,符号链接位于 /texplore/devel/lib/
我尝试了以下方法:
(1) 导出 /texplore/devel/lib/ 到 LD_LIBRARY_PATH
(2) 在 /texplore/src/rl_experiment/src 中的库中添加符号链接
(3) 将库路径添加到target_link_libraries
target_link_libraries(experiment agentlib envlib ${catkin_LIBRARIES}
"/media/usr/texplore/devel/lib/libagentlib.so"
"/media/usr/texplore/devel/lib/libenvlib.so")
(4)设置链接器的搜索路径
SET(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,/media/usr/texplore/devel/lib/")
它没有用。最后,我将符号链接添加到 /usr/local/lib 并且它起作用了。但我不想要这个文件夹中的符号链接。
所以链接器根本不搜索构建树。我的问题是,为什么catkin 没有在catkin_LIBRARIES 中添加链接器路径?我以前构建过 ROS 包,但无法理解为什么这个特定包不起作用。
解决方案
我遇到了同样的问题。我根据 ROS Answers 上的这篇文章和 catkin_packages 宏的通用 CMakeLists.txt 文件中的以下评论进行了以下更改:
## LIBRARIES: libraries you create in this project that dependent projects also need
我做了一些事情来解决这个问题......
- 添加
LIBRARIES agentlib
到文件中的catkin_packages
宏rl_agent/CMakeLists.txt
。这使得该agentlib
库以后可用于rl_experiment
. - 添加
LIBRARIES envlib
到文件中的catkin_packages
宏rl_env/CMakeLists.txt
。这使得该envlib
库以后可用于rl_experiment
. - 从文件中的
agentlib
宏中删除。这些不是必需的。envlib
target_link_libraries
rl_experiment/CMakeLists.txt
- 已验证
rl_agent
和rl_env
包都列find_package
在rl_experiment/CMakeLists.txt
.
...然后一切都成功编译。
添加片段以进一步澄清...
- rl_agent CMakeLists.TXT 更改(以上第 1 项):
...
## Declare a cpp library
# add_library(rgbd_tools
# src/${PROJECT_NAME}/
# )
add_library(agentlib
src/Agent/DiscretizationAgent.cc
src/Agent/QLearner.cc
...
src/newmat/newmatrm.cc
src/newmat/newmat9.cc
)
## Declare a cpp executable
# add_executable(rgbd_tools_node src/rgbd_tools_node.cpp)
...
- rl_env CMakeLists.txt 更改(上面的第 2 项):
...
###################################
## catkin specific configuration ##
###################################
...
catkin_package(
INCLUDE_DIRS include
LIBRARIES envlib
# CATKIN_DEPENDS roscpp rospy std_msgs
CATKIN_DEPENDS message_runtime
# DEPENDS system_lib
)
...
- rl_experiment CMakeLists.txt 更改(上面的项目 3 和 4):
...
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
rl_common
rl_env
rl_agent
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
...
## Declare a cpp executable
# add_executable(rgbd_tools_node src/rgbd_tools_node.cpp)
add_executable(experiment src/rl.cc)
# target_link_libraries(experiment agentlib envlib ${catkin_LIBRARIES})
target_link_libraries(experiment ${catkin_LIBRARIES})
#add_executable(image_converter src/image_converter.cpp)
...
推荐阅读
- visual-studio-code - 在扩展安装过程中更改 VSCode 远程临时目录
- javascript - 您如何在 Alexa Skills 中创建 sessionAttribute?
- python - 单击按钮时找不到 tkinter 图像
- python - 我们如何将 numpy 数组拆分为数字的倍数?(例如:数组 1:0-33,数组 2:34-66,数组 3:67-100)
- html - 在 pronting 视图中,我将正文设置为 `display: none;` 并将文本设置为 `display: block !important;` 但没有显示任何内容
- python - tkinter 更新线程进度的进度条
- bash - 查找最后一次出现并使用 sed 前置
- .net-core - 如果默认值,Aspnetcore Web API 会抑制属性
- kubernetes - Kubernetes 集群中 Prometheus 监控 Pod 失败 dcp 拨号连接被拒绝
- python-2.7 - 无法启动 Airflow Server - OSError: [Errno 2] No such file or directory