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

问题描述 投票:0回答:2

根据这个SO问题,Linux可执行文件无法在同一文件夹中找到共享库传递

-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 escaping rpath
2个回答
3
投票

正如您已经注意到的,您应该使用

CMAKE_INSTALL_RPATH
INSTALL_RPATH
INSTALL_RPATH
在安装特定目标时设置
rpath
CMAKE_INSTALL_RPATH
是全局变体,对所有目标执行相同的操作。

我也挣扎过,如何逃脱

$ORIGIN
。 但是,对我来说,它根本不需要逃避它就可以工作:

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

0
投票

对我来说,这不仅仅是设置

CMAKE_INSTALL_RPATH
(cmake版本3.20.2):

我已在顶级 CMakeLists.txt 文件中设置

CMAKE_INSTALL_RPATH

set(CMAKE_INSTALL_RPATH "${LIB_INSTALL_PATH}:$ORIGIN")

此示例还添加了我创建的变量的另一个路径

LIB_INSTALL_PATH

对于目标的 CMakeLists.txt 我有:

 set_target_properties(mytarget
   PROPERTIES
      BUILD_WITH_INSTALL_RPATH true
      LINK_OPTIONS "-Wl,--disable-new-dtags"
)

--disable-new-dtags
需要使用
RPATH
代替
RUNPATH
(新的默认值),这显然有问题。

不向目标 CMakeLists.txt 文件添加任何内容会导致 RPATH 设置为构建路径:

 0x000000000000000f (RPATH)              Library rpath: [/home/brookbot/workspace/my_project/build/tgt/stuff:/home/brookbot/workspace/my_project/build/tgt]

但是将属性

BUILD_WITH_INSTALL_RPATH true
添加到目标给了我想要的结果:

0x000000000000000f (RPATH)              Library rpath: [/my/install/path:$ORIGIN]

我正在使用

readelf -d
检查结果。

© www.soinside.com 2019 - 2024. All rights reserved.