根据这个 Stack Overflow 问题(Linux executable can't find shared library in same folder),通过传递
我们正在使用 cmake,所以我正在添加一个类似以下形式的行:
请注意,我们的构建过程的一部分涉及将
-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工件。因此,在测试构建树和Docker容器中安装可执行文件时,使用-rpath=${ORIGIN}
是适用的。