如何分辨G ++编译器到哪里寻找包括文件?(How to tell g++ compiler whe

2019-07-21 21:19发布

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

例如:

#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++ )。

Answer 1:

可阅读手册

它的存在给大家看了。 你甚至有使用什么选择(我用的第一个去):

-Idir

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

如果一个标准的系统包含目录,或指定一个目录-isystem ,也与指定-I ,则-I选项将被忽略。 该目录仍然搜索而是作为在系统中的其正常位置的系统目录包括链。 这是为了确保在GCC的过程来修复系统马车头和用于排序include_next指令不会被不经意地改变。 如果确实需要更改系统目录搜索顺序,用-nostdinc和/或-isystem选项。

-iquotedir

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



Answer 2:

正如你已经被告知,这是非常有用的阅读手册 -特别是这章 -甚至更特别在这里 。

具体而言,您希望

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

还要注意对文件#include指令语法,说明这里是:

2.1包含语法

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

 #include <file> 

这种变体是用于系统头文件。 它搜索系统目录的标准列表文件中指定的文件。 你可以在前面加上目录到这个列表与-I选项(参见调用)。

 #include "file" 

这种变异是用于你自己的程序的头文件。 它首先搜索一个文件名为文件中包含当前文件的目录,则在报价目录,然后用于同一目录<file> 。 你可以在前面加上目录与-iquote期权报价的目录列表。 的参数#include ,无论是分隔的引号或尖括号,行为像常数,注释不被识别的字符串和宏名称不扩大。 因此, #include <x/*y>指定包含命名为x / * Y系统头文件的。

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

这是一个错误,如果有任何东西(不是注释等)上的文件名之后的行。

因此,例如

#include "first.h"

开始寻找在同一个目录中包含该指令.cpp文件(或采取到该目录作为相对的相对路径)。

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

#include <dir1/third.h>

通常的做法是使用#include "local.h"形式为图书馆/包/模块内报头(但是您选择来组织),以及#include <external.h>用于从外部/第三头形式三方或系统库。



Answer 3:

对于GCC它是-I选项报头包括 。 对于.cpp文件,你只需要那些出现作为参数传递给gcc的命令。



文章来源: How to tell g++ compiler where to search for include files?