OS: Ubuntu 22.04.1
gcc: 11.2.0
glibc: 2.35
#include “header.h” 与 #include <header.h> 区别
#include “header.h” 引入的头文件,默认会首先在 .c 当前目录查找;而#include <header.h> 则不会。
1 | $ cat 004_header_search.c |
头文件搜索相关的command option 和环境变量
- -I dir: 可以同时指定多个,优先级从左到右,可以使用.表示当前目录(-I. -I/special/include)
- -iquota dir: 只适用于以引号 “” 导入的头文件
- -isystem dir
- -idirafter dir
- CPATH: 可以指定多个,优先级从左到右,冒号分割,适用于C/C++/objc语言;可以包含空的元素(:/special/include)表示当前目录
- C_INCLUDE_PATH: 只适用于C语言
- CPLUS_INCLUDE_PATH: 只适用于C++语言
- OBJC_INCLUDE_PATH: 只适用于objc语言
查找顺序为:
- 对于用 #include “” 引号形式引入的头文件,首先搜索当前程序文件所在的目录,其次再前往 -iquote 选项指定的目录中查找;
- 搜索 -I 选项指定的目录
- 搜索 CPATH 环境变量指定的目录
- 搜索 -isystem 选项指定的目录
- 搜索C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/OBJC_INCLUDE_PATH 环境变量指定的目录
- 搜索默认的系统路径;
1) /usr/lib/gcc/x86_64-linux-gnu/11/include
2) /usr/local/include/x86_64-linux-gnu
3) /usr/local/include
4) /usr/lib/gcc/x86_64-linux-gnu/11/include-fixed
5) /usr/x86_64-linux-gnu/include
6) /usr/include/x86_64-linux-gnu
7) /usr/include - 搜索-idirafter 选项指定的目录。
如果默认的系统路径或-isystem指定的路径,也被指定在了-I的参数中时,-I里面的不生效。
gcc编译命令查看头文件查找顺序
gcc 命令的-v参数可以显示编译过程中的调用的程序以及相关的日志信息
1 | $ cat 004_header_search.c |