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++构建静态库和动态库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)