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

How to tell g++ compiler where to search for include files?

本文关键字:搜索 包含 文件 在哪里 编译器 何告诉 g++      更新时间:2023-10-16

在一个"工作目录"中,我有很多相互#include的*.cpp和*.h文件以及子目录中的文件。

例如:

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

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

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

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

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

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

正如您已经被告知的那样,阅读手册-特别是本章-甚至更具体地在这里是有用的。

具体来说,您需要

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

还要注意#include指令语法的文档,这里描述为:

2.1包含语法

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

#include <file>

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

#include "file"

此变体用于您自己程序的头文件。它首先在目录中搜索名为file的文件包含当前文件,然后在引用目录中,然后与<file>使用的目录相同。可以将目录添加到带有-iquote选项的引用目录列表。的论证#include,无论是用引号还是尖括号分隔,行为类似于字符串常量,因为注释不能被识别,并且宏名称不会展开。因此,#include <x/*y>指定包含一个名为x/*y.

的系统头文件

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

如果行上有任何内容(除了注释),则表示错误

例如

#include "first.h"

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

如果你想使用包含路径(由-I指定),你应该使用

#include <dir1/third.h>

通常的做法是对库/包/模块内的头文件使用#include "local.h"形式(无论您选择如何组织),并对外部/第三方或系统库的头文件使用#include <external.h>形式。

Read The Fine Manual

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

-Idir

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

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

-iquotedir

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

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

每个C/c++编译器(g++, gcc, MinGW, clang等)都有一个名为"include"的文件夹。在它的根路径中自动查找头文件。如果您使用MinGW,它将在,例如:"C:MinGWinclude"。只需将您的头文件保存到include文件夹中,如下所示:C:MinGWincludeheader1.h或C:MinGWincludeLibGUI windows .h