gpt4 book ai didi

c++ - 如何避免在 CMake 安装步骤中删除 RPATH?

转载 作者:行者123 更新时间:2023-12-05 04:25:29 25 4
gpt4 key购买 nike

我正在使用 CMake 开发一个 C++ 项目,我在其中构建了一个可执行文件 foo使用共享库的 libbar (这是通过 ExternalProject_add 添加的)。

可执行文件 build/src/foo在构建目录中工作得很好。但是,如果我运行 make install ,已安装的可执行文件 /bin/foo给我以下错误。

./foo: error while loading shared libraries: libbar.so.11: cannot open shared object file: No such file or directory

我知道我不是唯一遇到这个问题的人(参见例如 here ),我也知道 rpath 的处理方式通过 CMake,参见 here .据我了解,install步骤剥离 rpath变量,解释找不到库文件。

我通过运行 ldd foo 检查了这一点在目录/build/src/结果

libbar.so => /PATH/TO/LIBBAR/libbar.so

当我在目录 /build/bin/ 中运行相同的命令时, 我得到

libbar.so => not found

现在是我的问题。一般情况下,如何避免可执行文件在安装过程中“忘记”共享库的位置?我基本上希望安装的可执行文件在 rpath 中具有相同的路径。作为build中的那个目录。

到目前为止我尝试了什么

我读到你可以避免剥离路径

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

然而,这根本行不通。我不知道为什么不,因为这是建议的精确解决方案 herein the documentation .

我当然可以手动设置路径

SET(CMAKE_INSTALL_RPATH "$LIBBAR_PATH}/lib")

这确实有效,但是这个解决方案对于 libbar 来说太具体了并且做例如不起作用,如果我在另一个也使用 libbar 的代码中导入该项目通过我的项目。

编辑

我应该补充一点,这个问题不会出现在所有机器上。我在 Linux 机器上得到它,它也说

-- Set runtime path of "/PATH/TO/foo" to ""

在安装过程中。我的 Mac 上没有这条线,我根本没有那个问题。

编辑 2

我刚刚看到我的问题甚至在 documentation 上被明确提及在常见问题下。他们还说添加 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)是解决方案。但这对我来说根本不起作用,我在这里做错了什么?

编辑 3

难道是CMAKE_INSTALL_RPATH_USE_LINK_PATH = True解决方案在这里不起作用,因为我正在添加 libbar通过ExternalProject ?文档指出

CMAKE_INSTALL_RPATH_USE_LINK_PATH is a boolean that if set to true will append directories in the linker search path and outside the project to the INSTALL_RPATH. This is used to initialize the target property INSTALL_RPATH_USE_LINK_PATH for all targets.

最佳答案

首先,感谢大家的评论和回答。我没有为我的问题找到一个完美而简单的答案,但我想分享一下我现在要做的事情。

据我了解,在安装过程中剥离 RPATH 是所需的行为,请参阅 the documentation .一般来说,RPATH 的清除不能简单地停用。从关于 stackoverflow 的其他问题,我看到在某些情况下可以设置

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

但这对我不起作用。我相信这是因为在我的特定设置中,共享库正在通过 ExternalProject_add 下载和构建。因此,在这种情况下,共享库不是来自项目外,参见here。 . (如果我在这方面有误,请纠正我。)

最后,我没有看到比手动设置安装 RPATH 更好的方法

SET(CMAKE_INSTALL_RPATH "${LIBBAR_PATH}/lib")

如果我想将使用libbar(我们称它为Project_A)的代码导入另一个项目Project_B,我将不得不设置Project_BCMakeLists.txt 中的 INSTALL_RPATH 也是如此。类似的东西

SET(CMAKE_INSTALL_RPATH "${EXTERNAL_DIR}/Project_A/external/libbar/lib")

我不认为这是一个完全令人满意的解决方案,但这是我能想到的最好的解决方案。如果有人知道更好的方法,例如如何使用适用于共享库构建的 CMAKE_INSTALL_RPATH_USE_LINK_PATH 选项作为同一构建树中的 ExternalProject,请随时展示更好的方法。

关于c++ - 如何避免在 CMake 安装步骤中删除 RPATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73248130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com