CMake:将软件包添加到rpath

时间:2019-04-03 03:22:02

标签: c++ cmake

我有一个用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的更便捷的方法是什么?

1 个答案:

答案 0 :(得分:0)

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,只需告知它这样做,如上所示。