在“工作目录”我有很多的*。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/
?
为了使它更加复杂, dir1
和dir2
不位于我的工作目录。 它们位于/root/workingdirectory2/
。 所以,我的第二个问题是,如果它可以解决通过让编译器这个问题知道子目录位于其他地方?
我还需要补充一点,我没有使用任何的发展环境和(使用命令行编译g++
)。
可阅读手册
它的存在给大家看了。 你甚至有使用什么选择(我用的第一个去):
-Idir
将目录dir添加到目录列表的头部要搜索的头文件。 这可用于覆盖系统头文件,替代你自己的版本,因为这些目录在系统头文件目录之前搜索。 但是,你不应该使用此选项添加包含供应商提供的系统头文件(使用目录-isystem
为)。 如果你使用一个以上的-I
选项,则目录按照左到右的顺序扫描; 标准的系统目录之后。
如果一个标准的系统包含目录,或指定一个目录-isystem
,也与指定-I
,则-I
选项将被忽略。 该目录仍然搜索而是作为在系统中的其正常位置的系统目录包括链。 这是为了确保在GCC的过程来修复系统马车头和用于排序include_next
指令不会被不经意地改变。 如果确实需要更改系统目录搜索顺序,用-nostdinc
和/或-isystem
选项。
-iquotedir
将目录dir添加到目录列表的头部要搜索的头文件只对的情况下#include "file"
; 他们没有搜索#include <file>
,否则就像-I
。
正如你已经被告知,这是非常有用的阅读手册 -特别是这章 -甚至更特别在这里 。
具体而言,您希望
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>
用于从外部/第三头形式三方或系统库。
对于GCC它是-I
选项报头包括 。 对于.cpp文件,你只需要那些出现作为参数传递给gcc的命令。