dgn*_*uff 5 escaping rpath cmake
根据this SO question,Linux executable can't find shared library in same folder传递-Wl,-rpath,${ORIGIN}
是让Linux可执行文件.so
在与可执行文件相同的目录中搜索s的方法。
我们正在使用 cmake,所以我添加了一行表单
target_link_options(Executable PRIVATE -Wl,-rpath=${ORIGIN})
Run Code Online (Sandbox Code Playgroud)
到 CMakeLists.txt。问题在于 cmake 试图将九个字符序列解释${ORIGIN}
为一个变量,并用空替换它。
到目前为止,我已经尝试过:
$${ORIGIN}
\${ORIGIN}
$\{ORIGIN\}
$$\{ORIGIN\}
\$\{ORIGIN\}
Run Code Online (Sandbox Code Playgroud)
这些都没有奏效。我怎样才能做到这一点?
- 编辑 -
正如@Tsyvarev 的评论所指出的,在我的特定情况下,这是一个 XY 问题,因为 cmake 具有直接设计用于操纵 rpath 的设施。使用这个,我能够得到一个解决方案。
就我而言,将以下三行添加到 CMakeLists.txt 就可以了。
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "$\{ORIGIN\}")
Run Code Online (Sandbox Code Playgroud)
请注意,我们构建过程的一部分涉及将 复制.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")
Run Code Online (Sandbox Code Playgroud)