编译器如何知道在哪里找到#include <stdio.h>?

Bro*_*olf 15 c++ compiler-construction include header-files

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

具体来说,我想知道它是如何知道在哪里找到#include <>括号.

#include "/Users/Brock/Desktop/Myfile.h"    // absolute reference
#include <stdio.h>                         // system relative reference?
Run Code Online (Sandbox Code Playgroud)

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

R S*_*hko 13

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

像/ usr/include这样的位置是众所周知的,并且该位置的"知识"内置于gcc中.像/ usr/local/include这样的位置不被认为是完全标准的,可以在使用configure的--with-local-prefix选项构建gcc时设置.

也就是说,您可以使用编译器-I命令行选项添加新目录以搜索包含文件的位置.尝试包含文件时,它将在我在第一段中讨论的目录之前查看使用-I标志指定的目录.


Chu*_*uck 12

操作系统不知道在哪里查找这些文件 - 编译器(或更准确地说,预处理器).它有一组搜索路径,它知道查找标题,就像你的命令shell有一组地方,它们会在你输入名字时查找要执行的程序.GCC文档解释了编译器如何执行此操作以及如何更改这些搜索路径.


Alo*_*hal 5

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