【问题标题】:ROS catkin build - cannot find shared libraryROS catkin build - 找不到共享库
【发布时间】:2019-06-13 17:21:53
【问题描述】:

我正在尝试构建这个 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++ linker ros catkin


    【解决方案1】:

    我遇到了同样的问题。我根据 ROS Answers 上的this post 和 catkin_packages 宏的通用 CMakeLists.txt 文件中的以下注释进行了以下更改:

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

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

    1. 已添加 LIBRARIES agentlibrl_agent/CMakeLists.txt 文件中的 catkin_packages 宏。这使得 agentlib 库稍后可用于 rl_experiment
    2. rl_env/CMakeLists.txt 文件中的catkin_packages 宏中添加了LIBRARIES envlib。这使得envlib 库稍后可用于rl_experiment
    3. rl_experiment/CMakeLists.txt 文件中的target_link_libraries 宏中删除了agentlibenvlib。这些不是必需的。
    4. 经过验证的rl_agentrl_env 包列在rl_experiment/CMakeLists.txtfind_package 宏中。

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

    添加 sn-ps 以进一步澄清...

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

    【讨论】:

    • 我已经尝试过了,但它仍然给出了同样的错误。
    • 无赖。从克隆 github 开始,我已经多次复制了这一点。我正在使用最新的 catkin 工具。如果我提供我的 CMakeLists.txt 文件会有帮助吗?
    • 是的,那肯定有帮助。
    • 将片段添加到原始答案中。我希望这会有所帮助!
    • 谢谢。添加 target_link_libraries(experiment ${catkin_LIBRARIES}) (第 3 项)为我做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多