如何告诉g++编译器在哪里搜索包含文件
How to tell g++ compiler where to search for include files?
在一个"工作目录"中,我有很多相互#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++
)。
正如您已经被告知的那样,阅读手册-特别是本章-甚至更具体地在这里是有用的。
具体来说,您需要
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
- CMakeList 中应包含哪些模块.txt以进行近似最近邻搜索?
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 包含在 std::regex 搜索中,使用 std::regex_token_iterator 从 std::sub_m
- 我将如何搜索这个包含数组的文件以查找剩余的任何船只?
- 如何在文件中搜索字符串并打印包含该字符串的行
- 包含标头中的搜索路径因编译器而异
- 搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
- Ram 空间在创建包含 60000 个元素的二叉搜索树时耗尽
- C++,我想在字符串中搜索一个字符,并输出包含该字符的所有单词
- 如何在文件中搜索关键字,然后打印其中包含的字符串
- 阻止 GCC 在包含搜索路径上搜索当前目录"-I-"选项
- 二叉搜索树包含功能
- QRegExp :搜索不包含其他模式的模式
- 如何在整个单词中搜索包含三个以上相同字母的单词
- 字符串搜索输入中包含的单词
- Python clang不搜索系统包含的路径
- 在QStringList中搜索特定项目,然后搜索可能包含项目的其他项目
- 如何在搜索表单的QMessageBox中包含QLineEdit
- 是否可以使用与 std::set 中包含的不同类型的元素来执行搜索和删除
- 如何告诉g++编译器在哪里搜索包含文件