添加相对依赖项路径:
cmakelists 常见用法_AI视觉网奇的博客-CSDN博客
运行时依赖库路径:
CMAKE_LIBRARY_PATH
去掉rpath:cmake_skip_rpath
什么是RPATH?
在Linux环境下,使用动态链接的程序在运行时会自动链接 ld.so
这个库(OS X上是 dyld
),然后通过 ld.so
来查找链接其它的库。而 RPATH
就是编译的时候链接到执行文件的链接库路径。OS X在 RPATH
的设置上和Linux还是有点出入的,OS X的 RPATH
采用的是绝对路径。
ld.so
搜索路径的优先级是这样的:
1. RPATH
,编译链接时加入 -rpath
参数指明所谓的 RUNPATH
,这样可执行文件(或者依赖其他动态链接库的动态链接库)就能告诉 ld.so
到哪里去搜索对应的动态链接库了。
2. LD_LIBRARY_PATH
,对于没有设定 RPATH
的可执行文件或者动态链接库,我们可以用 LD_LIBRARY_PATH
这个环境变量通知 ld.so
往哪里查找链接库。
3. /etc/ld.so.conf
,系统对 ld.so
的路径配置文件。
4. /usr/lib
、 /lib
和 /usr/local/lib
,系统默认路径。
Cmake和RPATH
在分发程序的时候,执行文件使用的链接库在系统内不一定会有,或者自带了的版本不对,一般都会在程序文件夹内都会附带相应的链接库,所以最好还是把 RPATH
加上。Cmake对RPATH提供了很多选项支持,我们一般只关注这几个变量就好了: CMAKE_SKIP_BUILD_RPATH
、 CMAKE_BUILD_WITH_INSTALL_RPATH
、 CMAKE_INSTALL_RPATH
和 CMAKE_INSTALL_RPATH_USE_LINK_PATH
。
默认RPATH设置
-
set(CMAKE_SKIP_BUILD_RPATH FALSE) # 编译时加上RPATH
-
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # 编译时RPATH不使用安装的RPATH
-
set(CMAKE_INSTALL_RPATH "") # 安装RPATH为空
-
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) # 安装的执行文件不加上RPATH
Cmake在默认情况下, make install
会把安装的执行文件的 RPATH
删掉的,所以就会出现上面我执行安装好的执行文件报错的问题。
加上完整的RPATH
Cmake的默认设置我们肯定是不能使用的,我们需要一个安装的时候也要带上 RPATH
的设置。
-
set(INSTALL_LIB_DIR "${PROJECT_BINARY_DIR}/lib") # 假设安装目录在编译目录的lib子目录内
-
set(CMAKE_SKIP_BUILD_RPATH FALSE)
-
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
-
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
-
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-
# 确保链接库不在系统默认安装的目录上时更改到项目lib上
-
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_RPATH} isSystemDir)
-
if("${isSystemDir}" STREQUAL "-1")
-
set(CMAKE_INSTALL_RPATH "${INSTALL_LIB_DIR}")
-
endif("${isSystemDir}" STREQUAL "-1")