我正在使用 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 https://stackoverflow.com/questions/32469953/why-is-cmake-designed-so-that-it-removes-runtime-path-when-installing),而且我也知道处理rpath
通过 CMake,请参阅here https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling。据我了解,install
步骤剥离rpath
变量,说明找不到库文件。
我通过运行检查了这一点ldd foo
在目录中/build/src/
导致
libbar.so => /PATH/TO/LIBBAR/libbar.so
当我在目录中运行相同的命令时/build/bin/
, I get
libbar.so => not found
现在我的问题。一般来说,如何避免可执行文件在安装过程中“忘记”共享库的位置?我基本上希望安装的可执行文件具有相同的路径rpath
正如其中的那个build
目录。
到目前为止我已经尝试过的
我读到你可以避免通过以下方式剥离路径
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
然而,这根本不起作用。我不知道为什么不,因为这是建议的精确解决方案here https://stackoverflow.com/questions/32469953/why-is-cmake-designed-so-that-it-removes-runtime-path-when-installing and 在文档中 https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling.
我当然可以通过手动设置路径
SET(CMAKE_INSTALL_RPATH "$LIBBAR_PATH}/lib")
这确实有效,但是这个解决方案太具体了libbar
并例如不起作用,如果我在另一个也使用的代码中导入这个项目libbar
通过我的项目。
EDIT
我应该补充一点,这个问题不会出现在所有机器上。我在 Linux 机器上得到它,它也说
-- Set runtime path of "/PATH/TO/foo" to ""
在安装过程中。我在 Mac 上没有看到这条线,在 Mac 上根本不存在这个问题。
EDIT 2
我刚刚看到我的问题甚至在文档 https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling under 常见问题。他们还说添加set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
是解决方案。但这对我来说根本不起作用,我在这里做错了什么?
EDIT 3
难道是CMAKE_INSTALL_RPATH_USE_LINK_PATH = True
解决方案在这里不起作用,因为我正在添加libbar
via ExternalProject
?该文档指出
CMAKE_INSTALL_RPATH_USE_LINK_PATH 是一个布尔值,如果设置为 true 将在链接器搜索路径中附加目录,并且项目外到 INSTALL_RPATH。这用于初始化所有目标的目标属性 INSTALL_RPATH_USE_LINK_PATH。