我刚刚发现我一直在做这个错误。我没有使用任何ide,只使用gcc。我也开始使用makefile编译我的大项目。
大部分时间文件结构都是这个
├── makefile
└── src
├── folder1
│ ├── header1.cpp
│ └── header1.h
├── folder2
│ ├── header2.cpp
│ └── header2.h
└── main.cpp
在header2.cpp
上,当我加入header1.h
时,我会这样做
file header2.cpp
#include "../folder1/header1.h"
这是我如何包含其他文件夹中的其他文件。 我想我做错了。我观看的大部分教程都使用了Ide,它们并没有像那样包含它。
有些像这样包含它
#include "folder1/header1.h"
或其他人将其放在像headers/
然后像这样包括它。
#include "header1.h"
任何人都可以指导我。我该如何实现这一目标。我一直这么做,包括我猜。
我不想包含这样的文件
#include "../../../../sofarfolder1/header1.h"
感谢。每当我看到我的代码时,它都会让我呕吐。
答案 0 :(得分:6)
如果您不想使用-Idir
,可以使用dir
标志告诉GCC在目录../
中查找头文件。
答案 1 :(得分:5)
https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
在您的makefile中,您可以使用-I../../../sofardirectory
这样,它会在该目录中查找您包含的标题。
答案 2 :(得分:1)
我如何处理标题取决于它们是否将被安装(与库一样)。
我将保留在项目源文件夹中的私有标题:
├── Makefile
└── src
├── header1.cpp
└── header1.h
├── header2.cpp
└── header2.h
└── main.cpp
然后就像这样包括它们:
#include "header1.h"
公共标题(要安装)我通常放在一个项目子文件夹中:
├── Makefile
└── src
├── project
│ ├── header1.h
│ └── header2.h
└── header1.cpp
└── header2.cpp
└── main.cpp
我把它们包括在内:
#include <project/header1.h>
为了找到公共标题,您需要设置编译器标志。适用于GCC
-I
g++ -Isrc ... etc ...
安装标题后,它们将会显示/usr/include
:
── usr
└── include
├── project
│ ├── header1.h
│ └── header2.h
客户端软件将以相同的方式包含它们:
#include <project/header1.h>
但是他们会提供不同的标志设置来找到它们:
g++ -I/usr/include ... etc ...
答案 3 :(得分:1)
使用编译器标志指定其他包含目录的一种不寻常的替代方法是使用C预处理器为包含文件路径创建定义的常量。
例如,如果您有一个包含相对路径的包含文件,例如#include "../../stuff/lib1/thing1.h"
,您可以执行以下操作。
#define THING1_H_PATH "../../stuff/lib1/thing1.h"
// ...
#include THING1_H_PATH
gcc C预处理器文档The C Preprocessor in section 1.3.2, The #include Directive有这样的说法:
#include其他任何东西
此变体称为计算#include。任何`#include&#39;指示 其论点不符合上述两种形式 是计算包含。其他任何内容都会检查宏 呼叫,这些呼叫被扩展(见section 1.4 Macros)。完成后, 结果必须符合以上两种变体之一 - 特别是, 扩展文本最后必须用引号或角度包围 括号。
此功能允许您定义控制的宏 文件名将在程序的稍后时间点使用。一个应用程序 这是为了允许您的特定于站点的配置文件 程序,用于指定系统名称,包括要使用的文件。 这有助于将程序移植到各种操作系统中 哪些必要的系统头文件在不同的地方找到。