我想知道Mac OS X,Windows和Linux上的编译器如何知道在哪里找到C头文件。
具体来说,我想知道它是如何知道在哪里找到带有<>
括号的#include。
#include "/Users/Brock/Desktop/Myfile.h" // absolute reference
#include <stdio.h> // system relative reference?
我认为系统上有一个文本文件可供咨询。它如何知道在哪里寻找标题?是否可以修改此文件,如果是这样,该文件驻留在操作系统上的哪个位置?
答案 0 :(得分:11)
构建编译器时,它知道几个标准位置来查找头文件。其中一些与编译器的安装位置无关(例如/ usr / include,/ usr / local / include等),其中一些基于编译器的安装位置(对于gcc,由编译器控制) - 运行configure时的--prefix选项。)
像/ usr / include这样的位置是众所周知的,并且该位置的“知识”内置于gcc中。像/ usr / local / include这样的位置不被认为是完全标准的,可以在使用configure的--with-local-prefix选项构建gcc时设置。
也就是说,您可以使用编译器-I命令行选项为搜索包含文件的位置添加新目录。在尝试包含文件时,它将在我在第一段中讨论的目录之前查看使用-I标志指定的目录。
答案 1 :(得分:11)
操作系统不知道在哪里查找这些文件 - 编译器(或更准确地说,预处理器)。它有一组搜索路径,它知道查找标题,就像你的命令shell有一组地方,它们会在你输入名字时查找要执行的程序。 The GCC documentation explains编译器如何做到这一点以及如何更改这些搜索路径。
答案 2 :(得分:4)
文件的位置取决于系统。实际上,该文件可能是 precompiled ,或者甚至可能不存在 - 编译器可能将其作为“内置”。在我的Macbook上,我看到/usr/include/c++/4.2.1/iostream
中有这样一个文件,但你不应该依赖它,而且编辑它肯定是一个坏主意。
答案 3 :(得分:2)
在Visual Studio中,如果使用IDE,则它位于项目设置中;如果使用命令行,则位于%INCLUDE%
环境变量中。
答案 4 :(得分:0)
如果您使用的是g ++,您可以执行以下操作来查找包含搜索路径的内容:
touch empty.cpp
g++ -v empty.cpp
我不知道是否有Xcode的等价物。也许这会起作用,因为Xcode基于GCC?
答案 5 :(得分:0)
您应该使用绝对路径避免使用#include文件。编译器在各个目录中搜索包含文件,并从每个目录开始包含文件。例如;
#include <boost/tokenizer.hpp>
正常工作,因为boost根目录包含一个名为'boost'的文件夹,该文件夹位于默认包含路径中,或者您执行了类似的操作。
g++ -I$BOOST_ROOT {blah, blah}
无论主机系统实际用于表示目录的是什么,UNIX分隔符'/'对所有系统都以相同的方式运行,这是C和C ++标准。正如其他提到的那样,偶尔#include实际上根本不包含真实文件。