84

因此,当我们执行以下操作时:

#include <stdio.h>

相对

#include "myFile.h"

编译器,在我的例子中是 GCC,知道 stdio.h(甚至是目标文件)在我的硬盘上的位置。它只是利用文件而没有我的交互。

认为在我的 Ubuntu Linux 机器上,文件存储在/usr/include/. 编译器如何知道在哪里查找这些文件?这是可配置的还是只是预期的默认值?我在哪里可以找到这个配置?

既然我在问这些包含文件的问题,那么文件的来源是什么?我知道这在 Linux 社区中可能很模糊,但谁来管理这些?谁将为 Windows 编译器提供和管理相同的文件。

我一直认为它们与编译器一起提供,但这是一个假设......

4

4 回答 4

55

见这里: 搜索路径

概括:

#include <stdio.h>

当包含文件在括号中时,预处理器首先搜索通过-I标志指定的路径。然后它搜索标准包含路径(参见上面的链接,并使用-v标志在您的系统上进行测试)。

#include "myFile.h"

当包含文件在引号中时,预处理器首先在当前目录中搜索,然后是-iquote指定的路径,然后是-I路径,然后是标准路径。

-nostdinc可用于阻止预处理器搜索标准路径。

环境变量也可用于添加搜索路径。

编译时如果使用-v标志,您可以看到使用的搜索路径。

于 2009-08-02T01:31:55.743 回答
48

gcc 是一个丰富而复杂的“编排”程序,它调用许多其他程序来执行其职责。出于查看系统搜索位置#include "goo"#include <zap>搜索位置的特定目的,我建议:

$ touch a.c
$ gcc -v -E a.c
 ...
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
# 1 "a.c"

这是查看包含文件的搜索列表的一种方法,包括(如果有的话)#include "..."将查找但#include <...>不会查找的目录。我显示的这个特定列表实际上是在 Mac OS X(又名 Darwin)上,但我推荐的命令会显示搜索列表(以及我在...这里替换的有趣的配置细节;-)在任何系统上gcc 运行正常。

于 2009-08-02T01:46:48.360 回答
10

Karl 回答了您的搜索路径问题,但就“文件来源”而言,需要注意的一件事是,如果您安装了该libfoo软件包并想用它进行一些开发(即,使用它的标头),您还需要安装libfoo-dev. /usr/include如您所见,标准库头文件已经在.

请注意,某些具有大量标头的库会将它们安装到子目录中,例如/usr/include/openssl. 要包含其中之一,只需提供不包含该部分的路径/usr/include,例如:

#include <openssl/aes.h>
于 2009-08-02T01:38:21.367 回答
4

gcc的\#include文件存储在/usr/include. g++ 的标准包含文件存储在/usr/include/c++.

于 2014-10-03T12:50:46.057 回答