根据这个SO问题,Linux executable can't find shared library in same folder传递-Wl,-rpath,${ORIGIN}
是让Linux可执行文件在与可执行文件相同的目录中搜索.so
的方法。
我们使用的是cmake,所以我添加了一行
target_link_options(Executable PRIVATE -Wl,-rpath=${ORIGIN})
这样做的问题是,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容器中最终安装可执行文件。
1条答案
按热度按时间mkshixfv1#
正如您已经注意到的,您应该使用
CMAKE_INSTALL_RPATH
或INSTALL_RPATH
。INSTALL_RPATH
在安装特定目标时设置rpath
。CMAKE_INSTALL_RPATH
是全局变量,对所有目标执行相同的操作。我也挣扎,如何逃脱
$ORIGIN
.但是,对我来说,它的工作原理没有逃脱它在所有: