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

Rom*_*man 20 c++ filesystems include

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

例如:

#include "first.h"
#include "second.h"
#include "dir1/third.h"
#include "dir2/fourth.h"
Run Code Online (Sandbox Code Playgroud)

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

#include "/root/workingdirectory/first.h"
Run Code Online (Sandbox Code Playgroud)

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

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

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

rub*_*nvb 13

阅读精细手册

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

-Idir
Run Code Online (Sandbox Code Playgroud)

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

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

-iquotedir
Run Code Online (Sandbox Code Playgroud)

将目录dir添加到要搜索的目录列表的头部,仅用于以下情况#include "file"; 它们不被搜索#include <file>,否则就像-I.


Use*_*ess 10

正如您已经被告知的那样,阅读本手册(特别是本章)非常有用,更具体地说就是这里.

具体来说,你想要的

g++ -I/root/workingdirectory -I/root/workingdirectory2
Run Code Online (Sandbox Code Playgroud)

另请注意有关#include指令语法的文档,此处描述如下:

2.1包含语法

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

#include <file>
Run Code Online (Sandbox Code Playgroud)

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

#include "file"
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以举个例子

#include "first.h"
Run Code Online (Sandbox Code Playgroud)

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

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

#include <dir1/third.h>
Run Code Online (Sandbox Code Playgroud)

通常的做法是#include "local.h"在库/包/模块中使用表头(但是你选择组织它),以及#include <external.h>来自外部/第三方或系统库的标题表单.


And*_*ite 3

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