CMake:如何使用CMake将rpath设置为${ORIGIN}

12
根据这个 Stack Overflow 问题(Linux executable can't 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工件。因此,在测试构建树和Docker容器中安装可执行文件时,使用-rpath=${ORIGIN}是适用的。

1
CMake有特殊的方法来指定RPATH。请参阅CMake RPATH handling wiki和该SO问题 - Tsyvarev
@Tsyvarev 谢谢您提供的信息,看起来我一直在试图解决一个 XY 问题。我已经编辑了问题,更具体地说明了我的问题,如果您将您的评论作为答案输入,我会接受它。 - dgnuff
1个回答

3

正如您已经注意到的,您应该使用CMAKE_INSTALL_RPATHINSTALL_RPATHINSTALL_RPATH在安装特定目标时设置rpathCMAKE_INSTALL_RPATH是全局变量,为所有目标执行相同的操作。

我也曾苦恼过如何转义$ORIGIN。 但是,对我来说,根本不需要转义它就可以工作:

set_target_properties(<target> PROPERTIES INSTALL_RPATH "$ORIGIN")

1
应该好好工作,因为$ORIGIN根本不是CMake期望的变量形式。 - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接