cmake 依赖项 相对路径 绝对路径

举报
风吹稻花香 发表于 2022/05/07 22:21:16 2022/05/07
【摘要】 添加相对依赖项路径: cmakelists 常见用法_AI视觉网奇的博客-CSDN博客 运行时依赖库路径: CMAKE_LIBRARY_PATH 去掉rpath:cmake_skip_rpath 什么是RPATH? 在Linux环境下,使用动态链接的程序在运行时会自动链接 ld.so 这个库(OS...

添加相对依赖项路径:

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设置


  1. set(CMAKE_SKIP_BUILD_RPATH FALSE) # 编译时加上RPATH

  2. set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # 编译时RPATH不使用安装的RPATH

  3. set(CMAKE_INSTALL_RPATH "") # 安装RPATH为空

  4. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) # 安装的执行文件不加上RPATH

Cmake在默认情况下, make install 会把安装的执行文件的 RPATH 删掉的,所以就会出现上面我执行安装好的执行文件报错的问题。

加上完整的RPATH

Cmake的默认设置我们肯定是不能使用的,我们需要一个安装的时候也要带上 RPATH 的设置。


  1. set(INSTALL_LIB_DIR "${PROJECT_BINARY_DIR}/lib") # 假设安装目录在编译目录的lib子目录内

  2. set(CMAKE_SKIP_BUILD_RPATH FALSE)

  3. set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

  4. set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

  5. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

  6. # 确保链接库不在系统默认安装的目录上时更改到项目lib上

  7. list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_RPATH} isSystemDir)

  8. if("${isSystemDir}" STREQUAL "-1")

  9. set(CMAKE_INSTALL_RPATH "${INSTALL_LIB_DIR}")

  10. endif("${isSystemDir}" STREQUAL "-1")

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/124633390

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。