`#include "FILE.h"` 是不是让 gcc 在当前目录或其他地方搜索 FILE.h?

Posted

技术标签:

【中文标题】`#include "FILE.h"` 是不是让 gcc 在当前目录或其他地方搜索 FILE.h?【英文标题】:Does `#include "FILE.h"` make gcc search for FILE.h in the current directory or somewhere else?`#include "FILE.h"` 是否让 gcc 在当前目录或其他地方搜索 FILE.h? 【发布时间】:2019-04-13 00:48:07 【问题描述】:

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
$

【问题讨论】:

另见Is the current directory default static library, dynamic library, and header search paths for gcc?回复后的评论 【参考方案1】:

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html 声明

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

对于尖括号形式#include <file>,预处理器的默认行为是只查看标准系统目录。

因此,您正在阅读的文档不正确。或许 Gough 先生从未尝试过写nonrecursive Makefile,或者将他的源目录和对象目录分开,因此从未注意到“当前目录”和“包含当前文件的目录”不一定是同一个东西。

GCC 有一大堆命令行选项,您可以使用它们来重新配置#include 的工作方式。甚至还有一个选项可以关闭查看当前文件的目录 (-I-),但它在许多操作系统上不可用,因为它会破坏 C 库的头文件。

【讨论】:

以上是关于`#include "FILE.h"` 是不是让 gcc 在当前目录或其他地方搜索 FILE.h?的主要内容,如果未能解决你的问题,请参考以下文章

iOS配置证书:Provisioning profile "xx_Distribution" doesn't include signing certificate &qu

UVA 12563 "Jin Ge Jin Qu hao" (背包)

C语言终极面试宝典

查找所有子目录下的所有头文件

Linux下Makefile学习笔记

qt语音解码cg729(widget类)