`#include“ FILE.h”`使gcc在当前目录或其他目录中搜索FILE.h吗?

时间:2019-04-13 00:48:07

标签: c gcc

Brian Gough的GCC简介

  

顺便说一下,包含状态的两种形式之间的差异-   #include "FILE.h"#include <FILE.h>是前者   在查找系统头文件目录之前,先在当前目录中搜索FILE.h。包含语句#include <FILE.h>   搜索系统头文件,但默认情况下不查找当前目录。

但是下面的示例似乎暗示包含正在编译的源文件的目录,而不是当前目录。什么是正确的?谢谢。

$ mv src/hello.h .
$ gcc  -c src/main.c
src/main.c:1:10: fatal error: hello.h: No such file or directory
 #include "hello.h"
          ^~~~~~~~~
compilation terminated.
$ mv hello.h src/
$ gcc  -c src/main.c
$

1 个答案:

答案 0 :(得分:2)

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html指出

  

默认情况下,预处理器首先查找指令#include "file"的引号形式所包含的头文件,该头文件相对于当前文件的目录,然后在标准系统目录的预配置列表中。例如,如果/usr/include/sys/stat.h包含#include "types.h",则GCC首先在types.h中搜索/usr/include/sys,然后在其通常的搜索路径中搜索

。      

对于尖括号#include <file>,预处理器的默认行为是仅在标准系统目录中查找。

因此,您正在阅读的文档不正确。也许Gough先生从未尝试编写nonrecursive Makefile或将其源目录和对象目录分开,因此从来没有注意到“当前目录”和“包含当前文件的目录”不一定是同一回事

GCC有很多命令行选项,您可以用来重新配置#include的工作方式。甚至有一个选项可以使 off 在当前文件(-I-)的目录中查找,但是在许多操作系统上都不可用,因为它将破坏C库的头文件。 / p>