cmake编译程序设置动态链接库加载路径
编译运行的程序需要链接到程序所在路径下的某些个动态库,为方便移植,必须设置链接库的相对路径,比如./lib
等等。默认在Linux系统下动态库的搜寻路径如下:
- 使用选项
-Wl,-rpath
在编译时指定; - 通过配置
LD_LIBRARY_PATH
来指定; - 在
/lib
和/usr/lib
中查找;
其中第一个在gcc编译选项中添加:-Wl,rpath=xxx
会将rpath路径写入到程序中保存起来。
为了方便移植运行一些编译安装的应用程序,在编译的时候需要设置链接库读取的相对路径目录, 比如../lib
或者./lib
。
默认在Linux系统下动态库的搜寻路径如下:
- 使用选项
-Wl,-rpath
在编译时指定rpath; - 通过配置
LD_LIBRARY_PATH
来指定,运行加载; - 在
/lib
和/usr/lib
等系统默认动态库路径中查找。
其中第一个在gcc编译
选项中添加:-Wl,rpath=xxx
会将rpath
路径写入到程序中保存起来。
以下两种方式都可以用来配置rpath路径。
1、使用gcc编译选项:
add_definitions(-std=c++11)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wl,-rpath=./:./lib") #-Wl,-rpath=./
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wl,-rpath=./:./lib") #-Wall
2、使用cmake配置
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_RPATH "./lib")
或者
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib:$ORIGIN/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
其中RPATH可以使用"./lib"
或"./"
配置,有可以使用"$ORIGIN/lib"
或"\${ORIGIN}/lib"
,这里必须加上\
符号,否则无法识别。
还可以同时定义多个RPATH,比如:"$ORIGIN:$ORIGIN/lib"
,中间使用:
分割。
参考:https://blog.csdn.net/wh8_2011/article/details/79519293
CMAKE和RPATH:https://blog.csdn.net/zhangzq86/article/details/80718559
CMAKE中RPATH的用法:https://blog.csdn.net/z296671124/article/details/86699720
Linux C编程使用相对路径加载动态库: https://blog.csdn.net/dreamcs/article/details/52138229