CMake和RPATH

默认情况下,CMake在编译时将库文件的搜索路径写入目标文件的DT_RPATH字段。但是在执行make install进行安装后,安装文件的DT_RPATH字段却消失了。

CMake提供了若干选项用于维护目标文件的RPATH,常用的有:

CMAKE_SKIP_RPATH
    布尔变量,TRUE表示在编译及安装阶段忽略RPATH。默认值为FALSE。

CMAKE_SKIP_BUILD_RPATH
    布尔变量,TRUE表示在编译阶段忽略RPATH。默认值为FALSE。

CMAKE_SKIP_INSTALL_RPATH
    布尔变量,TRUE表示在安装阶段忽略RPATH。默认值为FALSE。

CMAKE_INSTALL_RPATH
    字符串变量,内容是一个以分号作为分隔符的路径列表。默认值为空。

    调用add_executable、add_library等指令创建目标文件时,CMake使用该变量的值初始化目标的INSTALL_TARGET属性,作为安装时的RPATH。因此要在调用add_xxxx指令前设置该变量,否则不起作用。

    注1:该变量被用于初始化所有目标文件的INSTALL_RPATH属性。

    注2:在写入安装文件的DT_RPATH字段时,路径列表中的分号会被替换成Linux系统惯用的冒号。

CMAKE_INSTALL_RPATH_USE_LINK_PATH
    布尔变量,TRUE表示将编译时库文件的搜索路径添加(append)至目标文件的INSTALL_RPATH属性。默认值为FALSE。

    与CMAKE_INSTALL_RPATH类似,该变量也是在初始化目标文件的INSTALL_TARGET属性时才起作用,因此也要在调用add_xxxx指令前设置该变量。

    注:该变量作用于所有目标文件的INSTALL_RPATH属性。

INSTALL_RPATH
    字符串类型的目标属性(target property),内容是一个以分号作为分隔符的路径列表,作为安装时的RPATH。

    注:在写入安装文件的DT_RPATH字段时,路径列表中的分号会被替换成Linux系统惯用的冒号。

默认情况下,CMAKE_SKIP_RPATH、CMAKE_SKIP_BUILD_RPATH、CMAKE_SKIP_INSTALL_RPATH均为FALSE,因此无论是编译目录树(build tree)还是安装目录树(install tree)中的目标文件,CMake都会为之添加RPATH。但是由于CMAKE_INSTALL_RPATH默认值为空,CMAKE_INSTALL_RPATH_USE_LINK_PATH默认值为FALSE,因此最终结果就是编译目录树中的目标文件有RPATH,但是安装目录树中的目标文件没有RPATH。

如果想保留安装文件的RPATH,有3种方法:

1 将变量CMAKE_INSTALL_RPATH_USE_LINK_PATH设为TRUE。

从效果上看,该方法将保留目标文件在编译阶段添加的RPATH。

2 设置变量CMAKE_INSTALL_RPATH。

3 独立设置每个目标文件的INSTALL_RPATH属性:

set_target_properties(目标文件 PROPERTIES INSTALL_RPATH 路径列表)

方法1、2会影响所有目标文件,推荐使用方法3。

参考链接:https://cmake.org/Wiki/CMake_RPATH_handling
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值