从 CMake 的 lib 目录加载共享库?
Load shared libraries from lib directory in CMake?
我已经从 examples repository 下载了一个 ROS2 演示。
具体我用过minimal_subscriber and minimal_publisher.
我在 /opt/ros2
中安装了 ROS2,当我使用 colcon build
构建这两个示例时,它会生成一个包含 lib/
、shared/
的 install/
目录和其他通常的目录结构。
我可以执行 运行 这些演示与我当前在我的机器上的设置完全没问题,但是这些可执行文件 link 到 /opt/ros2
中存在的库,所以当我想执行它们在另一台没有安装 ROS2 的机器上,或者我将我的 ROS2 安装移动到我的机器上,可执行文件找不到共享对象。
我添加了一个非常简单的脚本,它在构建时将所有依赖项添加到 install/lib
但可执行文件似乎并不关心,它们不在生成的 [=17= 中寻找共享库] 目录,他们继续尝试在 /opt/ros2
.
中搜索
我相信这是我应该在 CMake 中解决的问题,它不是特定于 ROS2 的,那么,有什么方法可以让我生成的可执行文件在不同的目录中搜索? (../lib
或 ./lib
在我的例子中)
如果您自己构建它们(假设因为您提到了 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
变量。有关详细信息,请参阅上面的 link 中的“Recommendations”。
我已经从 examples repository 下载了一个 ROS2 演示。
具体我用过minimal_subscriber and minimal_publisher.
我在 /opt/ros2
中安装了 ROS2,当我使用 colcon build
构建这两个示例时,它会生成一个包含 lib/
、shared/
的 install/
目录和其他通常的目录结构。
我可以执行 运行 这些演示与我当前在我的机器上的设置完全没问题,但是这些可执行文件 link 到 /opt/ros2
中存在的库,所以当我想执行它们在另一台没有安装 ROS2 的机器上,或者我将我的 ROS2 安装移动到我的机器上,可执行文件找不到共享对象。
我添加了一个非常简单的脚本,它在构建时将所有依赖项添加到 install/lib
但可执行文件似乎并不关心,它们不在生成的 [=17= 中寻找共享库] 目录,他们继续尝试在 /opt/ros2
.
我相信这是我应该在 CMake 中解决的问题,它不是特定于 ROS2 的,那么,有什么方法可以让我生成的可执行文件在不同的目录中搜索? (../lib
或 ./lib
在我的例子中)
如果您自己构建它们(假设因为您提到了 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
变量。有关详细信息,请参阅上面的 link 中的“Recommendations”。