26

在“工作目录”中,我有很多#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/

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

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

4

4 回答 4

15

正如您已经被告知的那样,阅读手册(特别是本章)很有用,尤其是在此处阅读。

具体来说,你想要

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 "x\n\\y"指定一个包含三个反斜杠的文件名。(一些系统解释\为路径名分隔符。所有这些也以/相同的方式解释。仅使用它是最便携的/。)

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

所以例如

#include "first.h"

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

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

#include <dir1/third.h>

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

于 2013-03-18T13:35:37.600 回答
13

阅读精美手册

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

-Idir

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

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

-iquotedir

#include "file"仅针对;的情况将目录 dir 添加到要搜索头文件的目录列表的头部 他们不被搜索#include <file>,否则就像-I.

于 2013-03-18T13:32:23.043 回答
3

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

于 2013-03-18T13:30:00.713 回答
-1

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

于 2020-08-09T18:26:58.500 回答