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
$
答案 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>