包含文件的存储位置-Ubuntu Linux,GCC


77

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

#include <stdio.h>

#include "myFile.h"

编译器(在我的情况下为GCC)知道stdio.h(甚至是目标文件)在我的硬盘上的位置。它只是利用文件,而没有我的参与。

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

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

我总是觉得它们随编译器一起提供的,但这只是一个假设。

Answers:


51

请参阅此处: 搜索路径

概要:

#include <stdio.h>

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

#include "myFile.h"

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

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

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

如果使用-v标志进行编译,则可以看到所使用的搜索路径。


45

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正常运行。


4
您能否在您提供的示例中解释从GCC知道在/ Library / Frameworks中搜索的内容?说,它在/ usr / include和/ usr / local / include中进行了硬编码搜索,但是其他目录从何而来?来自环境?
rlib

10

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

请注意,某些带有很多头文件的库会将它们安装到子目录中,例如/usr/include/openssl。要包括其中之一,只需提供不带/usr/include零件的路径,例如:

#include <openssl/aes.h>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.