C/C++库和头文件的查找顺序

环境说明

ubuntu 18.04

gcc 7.5.0

必要性

不会有人没遇到过 collect2.exe: error: ld returned 1 exit status 吧,对于我这样的 C++ 新手,安装第三方库都不知道头文件和库文件被安装在哪儿了,自然也不明白怎么去用,经常遇到“不知道包含哪些头文件”,“如何指定链接方式”, “为什么链接错误”等问题,然后一天就在抓耳挠腮的中过去了。

头文件的查找顺序

  1. 先搜索当前目录(此时一般都是引用自己写的 .h 文件,用双引号包含 #include “tools.h”);
  2. 搜索-I选项指定的目录(gcc ... -Ixxx);
  3. 搜索环境变量 C_INCLUDE_PATHCPLUS_INCLUDE_PATHCPATH 指定的目录(不建议使用,参考详解Linux下环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、CPATH以及常见错误);
  4. 搜索编译器内定的目录,可以通过 cpp -v 查看(也是源码安装的第三方库默认的安装路径)。

image-20230308141125920

库的查找顺序

因为有静态库和动态库之分,所以库的查找顺序分为“编译时库的查找顺序”和“运行时库的查找顺序”。

编译时库的查找顺序

  1. -L-Wl,-rpath 指定的路径;
  2. 环境变量 LD_LIBRARY_PATH 里指定的路径;
  3. 查找 /etc/ld.so.conf 文件指定的路径(其默认路径我一般简记为 /lib/usr/libusr/local/lib以及这些路径下跟机器架构相关的路径);

image-20230308161120859

运行时动态库查找路径

动态库这玩意儿出现后,不仅要在编译时指定库的搜索路径,还要在运行时指定。

  1. 编译时 -Wl,-rpath 指定的路径;
  2. 环境变量 LD_LIBRARY_PATH 里指定的路径;
  3. 查找 /etc/ld.so.conf 文件指定的路径;

没错,最可恨的是 -L 指定的路径不在其中!

关于如何使用这几种方式的使用可以参考C/C++构建静态库和动态库

posted @ 2023-03-08 16:24  zwjason  阅读(293)  评论(0编辑  收藏  举报