CMakeLists学习二、链接库搜索路径与ld

  • 前言
  • gcc的链接
    • gcc链接命令
    • ld搜索路径
    • ldconfig刷新动态库缓存
  • CMakeLists指定链接搜索路径
  • 后记

前言

本文继续CMakeLists相关学习,链接库的相关问题。

gcc的链接

gcc链接命令

首先需要知道gcc编译时的链接指令:

gcc -o helloworld helloworld.c -I/path_to_include -i xxx.h -L/path_to_lib -lxxx

以上这行命令,-I/dir指定了gcc搜索头文件的路径,-i指定头文件名,-L/dir指定搜索库文件的路径,-l指定了库文件名(-lxxx的库文件名为libxxx.so或libxxx.a)

如果库文件路径下同时有.so和.a,则优先使用动态库链接;可以通过-static指定链接静态库。

ld搜索路径

ld的动态库搜索路径按顺序为:

gcc指令-L/dir路径 (非默认)
环境变量LD_LIBRARY_PATH路径 (默认)
配置文件/etc/ld.so.conf中的路径 (默认)
默认路径/lib,/usr/lib或者/lib64,/usr/lib64 (默认)

ld的静态库搜索路径按顺序为:

gcc指令-L/dir路径 (非默认)
环境变量LIBRARY_PATH路径 (默认)
默认路径/lib,/usr/lib,/usr/local/lib (默认)

顺便说一下头文件的搜索路径,可以通过gcc指令打印出来:

`gcc -print-prog-name=cc1plus` -v

大致有

gcc指定-I/dir路径
.cpp文件中#include给定的头文件相对路径
/usr/include
/usr/local/include

可以通过ld命令查看当前链接库搜索的默认路径:

ld --verbose |grep SEARCH

ldconfig刷新动态库缓存

每次开机时系统自动运行ldconfig命令刷新动态链接库缓存/etc/ld.so.cache

当在动态库的默认路径下安装了一个新动态库时,如果没有刷新动态库缓存,ld就找不到这个新库,然后就报ld: undefined reference.

解决办法就是手动刷新缓存:

sudo ldconfig

CMakeLists指定链接搜索路径

上篇采用find_package()可以得到OpenCV等第三方库文件的名字<Package>_LIBRARIES,而这些库文件一般通过make install安装到/usr/local/lib下了(比如在OpenCV编译安装的最后一步,在/etc/ld.so.conf.d/opencv.conf中配置/usr/local/lib),因此ld可以找到这些库文件。

如果库文件没有放在默认的库文件搜索路径下,比如需要链接/path_to_xxx/libxxx.so,则需要使用link_directories指令:

link_directories(/path_to_xxx)

该命令相当于gcc -L/dir

后记

本篇与上篇关系紧密,是使用CMakeLists最容易报错的地方。如果出现连接问题,可以在CMakeLists.txt中多使用message()命令,打印出配置包的路径。

CMakeLists学习二、链接库搜索路径与ld相关推荐

  1. linux下C/C++编译时系统搜索 include 和 链接库 文件路径的指定

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  2. adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...

    一.gcc编译过程 gcc -E hello.c -o hello.s //预处理 gcc -S hello.s -o hello.i //编译 gcc -c hello.i -o hello.o / ...

  3. linux c 编译时 include 和 链接库 文件路径指定

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  4. 关于环境变量 C++ include搜索路径,lib库搜索路径

    OneCoder在学习C++的过程中,在研究Windows下Eclipse for C/C++开发环境的过程中遇到的一些关于C++环境变量的一些问题.在网上搜索一番,得到下面的文章,与大家分享. 转自 ...

  5. 环境变量,include搜索路径,lib库搜索路径

    环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...

  6. linux下运行时链接库的路径顺序

    那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻: 1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L): exampl ...

  7. GDB动态库搜索路径

    笔记: 当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-sea ...

  8. rpath添加依赖库搜索路径

    windows 下一个程序的dll搜索路径首先是程序目录,然后是一些系统目录.linux 下的可以通过设置 LD_LIBRARY_PATH 等方法来添加搜索路径,但是这些路径是定死的,如果要实现程序目 ...

  9. Python批量添加库搜索路径

    被win10 给坑了,换回Win7. 重装系统后,继续使用Python,Eclipse不用重装,pydev不用重装,只需重装Python2.7.6 X64 for win即可.然后,默认已安装的Pyt ...

最新文章

  1. java dagger2_从零开始搭建一个项目(rxJava+Retrofit+Dagger2) ---上
  2. 人工智能科普|自然语言处理(NLP)
  3. 36.迷宫(广度优先搜索)
  4. qt 判断ctrl键被按下_惊雷!证监会公告,又一家千亿白马股被按下“暂停键”...
  5. 网站安全编程 黑客入侵 脚本黑客 高级语法入侵 C/C++ C# PHP JSP 编程
  6. 【转】解决svn Authorization failed错误
  7. PHP+Mysql高仿百度知道签到源码演示与下载
  8. 你们也只剩下点赞的交情
  9. 目标检测排行榜_3D领域重大突破!大华股份人工智能取得KITTI Object 3D车辆检测排行榜第一名...
  10. 使用hierarchyid查询分层数据
  11. 架构名词,涉及的技术
  12. Word 里面如何设置多级标题
  13. OA 系统中的流程管理
  14. iperf3网络测速
  15. 什么手机便签软件好用
  16. 学渣笔记——Java常用基本数据类型
  17. Excel字符函数(3):字符查找函数Find、Search
  18. jQuery制作手风琴图片切换效果
  19. 嵌入式1553B总线开发板的应用
  20. springboot微信点餐系统项目设计

热门文章

  1. 【Oracle】高级查询练习题详解
  2. 股市java_Java获取股市交易日
  3. 安装VMware15一直提示重启电脑
  4. 英文手写之意大利斜体
  5. 贷前审批策略的6个搭建思路
  6. 《联邦学习》——个人笔记(四)
  7. 批归一化作用_为什么数据要做归一化处理,什么是批归一化?
  8. 南大通用事务型数据库GBase 8s斩获2020年中国国际金融展“金鼎奖”
  9. 【gensim问题记录】EOFError: unexpected end of input; is count incorrect or file otherwise damaged?
  10. 微信小程序(八):地图