C/C++库和头文件的查找顺序
环境说明
ubuntu 18.04
gcc 7.5.0
必要性
不会有人没遇到过 collect2.exe: error: ld returned 1 exit status
吧,对于我这样的 C++ 新手,安装第三方库都不知道头文件和库文件被安装在哪儿了,自然也不明白怎么去用,经常遇到“不知道包含哪些头文件”,“如何指定链接方式”, “为什么链接错误”等问题,然后一天就在抓耳挠腮的中过去了。
头文件的查找顺序
- 先搜索当前目录(此时一般都是引用自己写的 .h 文件,用双引号包含
#include “tools.h”
); - 搜索
-I
选项指定的目录(gcc ... -Ixxx
); - 搜索环境变量
C_INCLUDE_PATH
,CPLUS_INCLUDE_PATH
和CPATH
指定的目录(不建议使用,参考详解Linux下环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、CPATH以及常见错误); - 搜索编译器内定的目录,可以通过
cpp -v
查看(也是源码安装的第三方库默认的安装路径)。
库的查找顺序
因为有静态库和动态库之分,所以库的查找顺序分为“编译时库的查找顺序”和“运行时库的查找顺序”。
编译时库的查找顺序
-L
或-Wl,-rpath
指定的路径;- 环境变量
LD_LIBRARY_PATH
里指定的路径; - 查找
/etc/ld.so.conf
文件指定的路径(其默认路径我一般简记为/lib
,/usr/lib
,usr/local/lib
以及这些路径下跟机器架构相关的路径);
运行时动态库查找路径
动态库这玩意儿出现后,不仅要在编译时指定库的搜索路径,还要在运行时指定。
- 编译时
-Wl,-rpath
指定的路径; - 环境变量
LD_LIBRARY_PATH
里指定的路径; - 查找
/etc/ld.so.conf
文件指定的路径;
没错,最可恨的是 -L
指定的路径不在其中!
关于如何使用这几种方式的使用可以参考C/C++构建静态库和动态库。