根据这个SO问题,Linux 可执行文件在同一文件夹中找不到共享库 https://stackoverflow.com/questions/39978762/linux-executable-cant-find-shared-library-in-same-folder通过-Wl,-rpath,${ORIGIN}
是获取 Linux 可执行文件进行搜索的方法.so
与可执行文件位于同一目录中。
我们正在使用 cmake,所以我添加了一行形式
target_link_options(Executable PRIVATE -Wl,-rpath=${ORIGIN})
到 CMakeLists.txt。问题是 cmake 尝试解释九个字符序列${ORIGIN}
作为变量,并将其替换为空。
到目前为止,我已经尝试过:
$${ORIGIN}
\${ORIGIN}
$\{ORIGIN\}
$$\{ORIGIN\}
\$\{ORIGIN\}
这些都没有奏效。我怎样才能完成这件事?
- 编辑 -
正如 @Tsyvarev 的评论所指出的,事实证明,在我的特定情况下这是一个 XY 问题,因为 cmake 具有直接设计用于操作 rpath 的设施。使用这个,我能够得到一个解决方案。
就我而言,将以下三行添加到 CMakeLists.txt 就可以了。
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "$\{ORIGIN\}")
请注意,我们构建过程的一部分涉及复制.so
到输出文件夹,为构建最终的 tarball 工件做准备。所以使用-rpath=${ORIGIN}
适用于构建树中的测试以及 Docker 容器中可执行文件的最终安装。
正如您已经注意到的,您应该使用CMAKE_INSTALL_RPATH
or INSTALL_RPATH
.
INSTALL_RPATH
设置rpath
安装特定目标时。CMAKE_INSTALL_RPATH
是全局变体,对所有目标执行相同的操作。
我也挣扎过,如何逃脱$ORIGIN
。
但是,对我来说,它根本不需要逃避它:
set_target_properties(<target> PROPERTIES INSTALL_RPATH "$ORIGIN")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)