C/C++ 头文件引入
C/C++ 中引入头文件有两种方式,#include ""
和 #include <>
。
双引号形式的 #include ""
会首先在当前文件所在目录下搜索尝试引入的头文件(并不会递归向下级目录搜索)。如果没有搜索到则去系统预先配置的标准头文件目录中寻找。类似的,尖括号形式的 #include <>
会直接在系统预先配置的标准头文件目录中寻找。
那系统预先配置的标准头文件目录是什么呢?对于 C 语言来说,在 Linux 下可以使用 cpp -v /dev/null -o /dev/null
命令来查看:
其中 #include <...> search starts here:
下面就是标准头文件目录,gcc 的预处理器 cpp 就会在这些目录下寻找头文件。我们也可以在其中的 /usr/include
目录下看到我们熟悉的 stdio.h
等文件。
类似的,查看 C++ 的标准头文件目录可以使用 g++ -v -E xxx.cpp > /dev/null
,把其中的 xxx.cpp
换成随便一个存在的 C++ 文件:
命令行选项
使用 gcc 编译的时候,还可以通过命令行选项来增添自定义的头文件搜索目录,其中最常用的是 -Idir
。当在编译时指定了这个选项,则预处理器会首先在当前目录下寻找头文件(假如使用的是 include ""
),然后在 -Idir
指定的目录中寻找头文件,最后在系统标准头文件目录中寻找。
-I
选项在编译 C/C++ 文件时都会生效,如果你想区分 C/C++ 文件,则可以使用 -iquote
和 -isystem
选项。-iquote
指定的目录只在编译 C 文件时生效,-isystem
指定的目录只在编译 C++ 文件时生效。
环境变量
同样环境变量也可以用来指定头文件搜索路径。CPATH
环境变量格式类似于 PATH
,即用冒号将多个目录分隔开:dir1:dir2:dir3
。使用 CPATH
指定的目录就相当于用 -I
选项指定了这些目录,只不过在搜索头文件的时候优先级低于所有直接用 -I
选项指定的目录。
类似的,如果你想分开控制 C/C++ 的搜索头文件的路径,则可以使用 C_INCLUDE_PATH
和 CPLUS_INCLUDE_PATH
。它们分别只对 C 文件和 C++ 文件生效。
参考材料
https://stackoverflow.com/questions/1217943/where-are-include-files-stored-ubuntu-linux-gcc
https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html#Environment-Variables
3 条评论
照片为啥是 py?
因为 py 是世界上最好的语言。
lz 赞一个,很详细,很有用