【问题标题】:Load shared libraries from lib directory in CMake?从 CMake 中的 lib 目录加载共享库?
【发布时间】:2020-05-04 09:12:30
【问题描述】:

我从examples repository 下载了一个 ROS2 演示。

具体来说,我用过minimal_subscriberminimal_publisher

我在/opt/ros2 中安装了ROS2,当我使用colcon build 构建这两个示例时,它会生成一个install/ 目录,其中包含lib/shared/ 和其他常用目录结构。

我可以在我的机器上使用我当前的设置完美地执行和运行这些演示,但是这些可执行文件链接到 /opt/ros2 中存在的库,所以当我想在另一台没有安装 ROS2 的机器上执行它们或者我移动我的 ROS2 时在我的机器上安装,可执行文件找不到共享对象。

我添加了一个非常简单的脚本,在构建时将所有依赖项添加到install/lib,但可执行文件似乎并不关心,他们并没有在生成的lib 目录中寻找共享库,他们一直在尝试在/opt/ros2中搜索。

我相信这是我应该在 CMake 中解决的问题,它不是 ROS2 特定的,所以,有什么方法可以告诉我生成的可执行文件在不同的目录中搜索? (../lib./lib 在我的情况下)

【问题讨论】:

    标签: c++ cmake shared-libraries ros2


    【解决方案1】:

    如果您自己构建它们(假设您提到了 CMake),您可以在 CMake 中设置 RPATH (docs here)。具体设置CMAKE_INSTALL_RPATH类似:

    set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
    

    如果您无法重建它们,您可以在您的环境中将 LD_LIBRARY_PATH 设置为库所在的位置,或者您可以使用 patchelf 使用更新的 RPATH 修补可执行文件本身。

    为了获得相对 RPATH 而不是绝对 RPATH,请在 rpath 规范中使用 $ORIGIN 变量。有关详细信息,请参阅上面的链接中的“Recommendations”。

    【讨论】:

    • 这是我尝试的第一件事。它解决了 /opt/ros2 依赖,但创建了另一个。 ${CMAKE_INSTALL_PREFIX} 是一个完整路径,因此当我将我的可执行文件和库移动到另一台机器时,我必须将它们保存在相同的路径中,否则它将无法工作,因为它正在搜索相同的 ${CMAKE_INSTALL_PREFIX}/lib 路径而不是相对路径路径
    • 我添加了关于使用$ORIGIN获取相对路径的更新。
    • 成功了!在我的特殊情况下,我必须使用set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib"),因为我是从install/bin/ 启动的,而库位于install/lib/ 中。我现在遇到的问题是找到了一些库而没有找到其他库,即使所有库都在 lib/ 内,但这是另一个完全不同的问题。谢谢你的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多