17

我想知道 Mac OS X、Windows 和 Linux 上的编译器如何知道在哪里可以找到 C 头文件。

具体来说,我想知道它如何知道在哪里可以找到带<>括号的#include。

#include "/Users/Brock/Desktop/Myfile.h"    // absolute reference
#include <stdio.h>                         // system relative reference?

我假设它咨询的系统上有一个文本文件。它如何知道在哪里寻找标题?是否可以修改此文件,如果可以,此文件驻留在操作系统的什么位置?

4

6 回答 6

15

编译器构建时,它知道一些标准位置来查找头文件。其中一些与编译器的安装位置无关(例如 /usr/include、/usr/local/include 等),而另一些则基于编译器的安装位置(对于 gcc,由--prefix 运行配置时的选项)。

/usr/include 之类的位置是众所周知的,并且该位置的“知识”内置在 gcc 中。/usr/local/include 之类的位置不被认为是完全标准的,可以在使用 configure 的 --with-local-prefix 选项构建 gcc 时进行设置。

也就是说,您可以使用编译器 -I 命令行选项添加新目录来搜索包含文件的位置。当试图包含一个文件时,它会在我在第一段中谈到的目录之前查找使用 -I 标志指定的目录。

于 2009-12-14T07:10:06.027 回答
13

操作系统不知道在哪里寻找这些文件——编译器知道(或更准确地说,预处理器)。它有一组搜索路径,它知道在其中查找标头,就像您的命令 shell 有一组位置,当您输入名称时它会在其中查找要执行的程序。GCC 文档解释了编译器是如何做到的以及如何更改这些搜索路径。

于 2009-12-14T07:13:53.023 回答
5

文件的位置取决于系统。实际上,该文件可能是预编译的,或者它甚至可能不存在——编译器可能将它作为“内置”。在我的 macbook 上,我看到 中有这样一个文件/usr/include/c++/4.2.1/iostream,但你不应该依赖它,编辑它绝对是个坏主意

于 2009-12-14T07:09:50.253 回答
2

在 Visual Studio 中,如果您使用 IDE,则它位于项目设置中;%INCLUDE%如果您使用命令行,则它位于环境变量中。

于 2009-12-14T09:59:43.523 回答
1

如果您使用的是 g++,您可以执行以下操作来找出搜索了哪些包含路径:

touch empty.cpp
g++ -v empty.cpp

我不知道 Xcode 是否有等价物。也许这会起作用,因为 Xcode 基于 GCC?

于 2009-12-14T07:17:13.983 回答
0

您应该避免使用绝对路径#include-ing 文件。编译器在各个目录中搜索包含文件并包含文件,从每个目录开始。例如;

#include <boost/tokenizer.hpp>

之所以有效,是因为 boost 根目录包含一个名为“boost”的文件夹,并且该文件夹位于您的默认包含路径中,或者您执行了类似的操作。

g++ -I$BOOST_ROOT {blah,  blah}

无论主机系统实际使用什么来表示目录,UNIX 分隔符“/”对于所有系统都将以相同的方式工作,这是 C 和 C++ 标准。正如其他人提到的,有时 #include 实际上根本不包含真实文件。

于 2009-12-14T10:21:31.723 回答