【问题标题】:CMake: add packages to rpathCMake:将包添加到 rpath
【发布时间】:2019-04-03 03:22:01
【问题描述】:

我有一个用 CMake 构建的动态库 libhelloworld.so,我已经安装在 /usr/local/lib64 中。我在构建可执行文件的 CMakeLists.txt 文件中链接库:

find_package(HelloWorld REQUIRED)
target_link_libraries(helloexecutable HelloWorld::HelloWorld)

CMake 可以很好地构建可执行文件,但是当我运行它时出现以下错误:

error while loading shared libraries: libhelloworld.so: cannot open shared object file: No such file or directory

我可以通过设置 rpath 解决问题

set(CMAKE_INSTALL_RPATH "/usr/local/lib64")

但这不是便携式的。

所以我有两个问题:1)CMake 不应该自动设置链接动态库的 rpath 吗?和 2) 如果 Cmake 可以自动设置 rpath,我该如何告诉它这样做,如果不能,那么设置 rpath 的更便携的方式是什么?

【问题讨论】:

标签: c++ cmake


【解决方案1】:

CMake wiki 中描述了观察到的行为(感谢 Tsyvarev!)

默认情况下,如果您不更改任何 RPATH 相关设置,CMake 将 将带有完整 RPATH 的可执行文件和共享库链接到所有使用的 构建树中的库。安装时会清空RPATH 这些目标,因此它们使用空 RPATH 安装。

这意味着您需要告诉 CMake 将 RPATH 中自动确定的部分添加到安装 RPATH 中,这些部分指向构建树之外的目录

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

换句话说,1) 是的,CMake 会自动设置 rpath,但默认情况下只针对构建树。 2) CMake 也可以为已安装的可执行文件设置 rpath,只需告诉它这样做,如上所示。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 2022-01-11
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2016-07-04
    相关资源
    最近更新 更多