因此,当我们执行以下操作时:
#include <stdio.h>
与
#include "myFile.h"
在我的情况下,编译器,GCC知道stdio.h(甚至是目标文件)在我的硬盘上的位置。它只是利用了我没有互动的文件。
我认为在我的Ubuntu Linux机器上,文件存储在/usr/include/
。 编译器如何知道在哪里查找这些文件?这是可配置的还是仅仅是预期的默认值?我在哪里寻找这种配置?
因为我问这些包含文件的问题,文件的来源是什么?我知道在Linux社区中这可能是模糊的,但谁管理这些?谁将为Windows编译器提供和管理相同的文件。
我总是认为他们来使用编译器,但这是一个假设......
答案 0 :(得分:44)
见这里:Search Path
要点:
#include <stdio.h>
当包含文件放在括号中时,预处理器首先在通过 -I 标志指定的路径中进行搜索。然后它搜索标准的包含路径(请参阅上面的链接,并使用 -v 标志在您的系统上进行测试)。
#include "myFile.h"
当包含文件在引号中时,预处理程序首先在当前目录中搜索,然后在 -iquote ,然后是 -I 路径,然后是标准路径中指定路径。
-nostdinc 可用于防止预处理器完全搜索标准路径。
Environment variables也可用于添加搜索路径。
如果使用 -v 标记进行编译,则可以看到使用的搜索路径。
答案 1 :(得分:43)
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正常运行的任何系统上。
答案 2 :(得分:10)
Karl回答了你的搜索路径问题,但就“文件来源”而言,有一点需要注意的是,如果你安装libfoo
软件包并希望用它做一些开发(即,使用其标题),您还需要安装libfoo-dev
。正如您所见,标准库头文件已经在/usr/include
中。
请注意,一些包含大量标题的库会将它们安装到子目录中,例如/usr/include/openssl
。要包含其中一个,只需提供没有/usr/include
部分的路径,例如:
#include <openssl/aes.h>
答案 3 :(得分:2)
gcc的\#include
个文件存储在/usr/include
中。
标准包含g ++的文件存储在/usr/include/c++
。