`#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