如何告诉g ++编译器在哪里搜索包含文件?

时间:2013-03-18 13:27:14

标签: c++ include filesystems

在“工作目录”中,我有很多* .cpp和* .h文件,彼此#include和子目录中的文件。

例如:

#include "first.h"
#include "second.h"
#include "dir1/third.h"
#include "dir2/fourth.h"

在我自己的目录中(与“working”目录不同)我想创建一个新的* .cpp和* .h文件,其中包含“working”目录中的一个文件。例如:

#include "/root/workingdirectory/first.h"

然而,它不起作用。因为“first.h”可能包含“second.h”,而“second.h”不在我的目录中。有没有办法告诉编译器它需要搜索不在当前但在工作目录中的包含文件:/root/workingdirectory/

为了使其更加复杂,dir1dir2不在我的工作目录中。它们位于/root/workingdirectory2/。所以,我的第二个问题是,是否有可能通过让编译器知道子目录位于其他地方来解决这个问题?

我还需要补充一点,我没有使用任何环境进行开发并从命令行进行编译(使用g++)。

4 个答案:

答案 0 :(得分:13)

Read The Fine Manual

每个人都可以阅读。你甚至可以选择使用什么(我会选择第一个):

-Idir
  

将目录dir添加到要搜索头文件的目录列表的头部。这可以用于覆盖系统头文件,替换您自己的版本,因为在系统头文件目录之前搜索这些目录。但是,您不应使用此选项添加包含供应商提供的系统头文件的目录(使用-isystem)。如果您使用多个-I选项,则会按从左到右的顺序扫描目录;标准系统目录来自。

     

如果标准系统包含目录或使用-isystem指定的目录,也会使用-I指定,则忽略-I选项。目录仍在搜索中,但作为系统目录在系统包含链中的正常位置。这是为了确保GCC修复错误系统头的过程和include_next指令的顺序不会被无意中更改。如果您确实需要更改系统目录的搜索顺序,请使用-nostdinc和/或-isystem选项。

-iquotedir
  

仅在#include "file"的情况下,将目录dir添加到要搜索的头文件列表的头部。它们不会搜索#include <file>,否则就像-I一样。

答案 1 :(得分:10)

正如您已经被告知的那样,它对read the manual非常有用 - 特别是this chapter - 甚至更具体地right here

具体来说,你想要

g++ -I/root/workingdirectory -I/root/workingdirectory2

还请注意有关#include指令语法的文档,将here描述为:

  

2.1包含语法

     

使用预处理包含用户和系统头文件   指令#include。它有两种变体:

#include <file>
     

此变体用于系统头文件。它在标准的系统目录列表中搜索名为file的文件。您可以使用-I将目录添加到此列表中   选项(请参阅调用)。

#include "file"
     

此变体用于您自己程序的头文件。它首先在目录中搜索名为file的文件   包含当前文件,然后在引用目录中然后   用于<file>的相同目录。您可以将目录添加到   带有-iquote选项的引用目录列表。的论点   #include,无论是用引号还是尖括号分隔,   表现得像一个字符串常量,因为注释无法识别,   和宏名称不扩展。因此,#include <x/*y>指定   包含名为x / * y的系统头文件。

     

但是,如果文件中出现反斜杠,则会考虑它们   普通文本字符,不是转义字符。没有人物   处理适合于C中的字符串常量的转义序列。   因此,#include "x\n\\y"指定包含三个的文件名   反斜杠。 (有些系统将\解释为路径名分隔符。全部   其中也以同样的方式解释/。它最易于使用   只有/。)

     

如果行上有任何内容(注释除外),则会出错   在文件名之后。

所以例如

#include "first.h"

启动查找与包含此指令的.cpp文件相同的目录(或者采用相对于此目录的相对路径)。

如果要使用包含路径(由-I指定),则应使用

#include <dir1/third.h>

通常的做法是在库/包/模块中使用#include "local.h"表单(但是您选择组织它),以及来自external / 3rd-的标题的#include <external.h>表单派对或系统库。

答案 2 :(得分:4)

对于gcc,它是header includes-I选项。对于.cpp文件,您只需要将它们作为gcc命令的参数出现。

答案 3 :(得分:-1)

每个C / C ++编译器(g ++,gcc,MinGW,clang等)在其根路径中都有一个名为“ include”的文件夹,它会在其中自动查找头文件。如果使用MinGW,它将位于例如“ C:\ MinGW \ include”中。只需将标头保存到包含文件夹中,如下所示:C:\ MinGW \ include \ header1.h或C:\ MinGW \ include \ LibGUI \ Window.h