我有一个用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的更便捷的方法是什么?
答案 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,只需告知它这样做,如上所示。