首页 > 解决方案 > 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 包,但无法理解为什么这个特定包不起作用。

标签: c++linkerroscatkin

解决方案


我遇到了同样的问题。我根据 ROS Answers 上的这篇文章和 catkin_packages 宏的通用 CMakeLists.txt 文件中的以下评论进行了以下更改:

## LIBRARIES: libraries you create in this project that dependent projects also need

我做了一些事情来解决这个问题......

  1. 添加 LIBRARIES agentlib到文件中的catkin_packagesrl_agent/CMakeLists.txt。这使得该agentlib库以后可用于rl_experiment.
  2. 添加LIBRARIES envlib到文件中的catkin_packagesrl_env/CMakeLists.txt。这使得该envlib库以后可用于rl_experiment.
  3. 从文件中的agentlib宏中删除。这些不是必需的。envlibtarget_link_librariesrl_experiment/CMakeLists.txt
  4. 已验证rl_agentrl_env包都列find_packagerl_experiment/CMakeLists.txt.

...然后一切都成功编译。

添加片段以进一步澄清...

  1. 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)

    ...
  1. 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
    )

    ...
  1. 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)
    ...

推荐阅读