C++完整路径下的include

17
我认为#include "../app/thing.h"非常难看,我希望能够从我的项目主目录导入,就像这样:#include <project/app/submodule/thing.h>。(我知道<>通常用于外部,但我认为它更加简洁)如何做到在项目的任何地方都可以实现这一点?

2
请看什么是相对路径,例如“../include/header.h”用于头文件的好处? - 简而言之,并没有太多好处,但存在一些责任。 - Jonathan Leffler
3
对于那些总是一起移动的文件,使用相对路径只是常识。而对于这些文件,必须使用""(双引号)来引用路径。 - Deduplicator
1
好的,你们俩说服了我,我会选择相对路径... - valentin
3个回答

9
您只需要确保构建过程设置了一个选项来指定搜索的起始点。
例如,如果您的标题在以下位置:
/work/username/src/project/app/submodule/thing.h

如果您使用符合POSIX标准的编译器(即使是MSVC,它也使用/I作为-I的类比),则需要包含以下内容:

-I/work/username/src

作为编译器的选项之一。您可以从项目的任何地方使用该路径,因为它是绝对路径。您只需要定义一个方法让您的构建系统知道设置应该是什么,这样当它被移动到/home/someone/src/时,您只需要更改一个设置。


并非每个编译器都需要使用-I - πάντα ῥεῖ
请指定一个 Windows 上的编译器,其中不是 -I?我已经在答案中添加了一个警告,并提到我认为 Windows 使用 /I,因为那里的选项以 / 开头而不是 - - Jonathan Leffler
我还没有遇到过不使用“-I”的编译器,但当然,可能有一些编译器不使用它。即使是微软的编译器也会使用“-I”(即使他们“更喜欢”/I)。 - Mats Petersson
问题中是否提到了Windows?有一些奇特的工具链使用不同的选项来实现此功能。 - πάντα ῥεῖ
@πάνταῥεῖ — 好的;你不打算给出任何奇特工具链的例子,所以除非我们偶然遇到它,否则我们将永远不知道你在想什么?从某个层面上说,我并不是非常担心;我已经涵盖了绝大多数实际情况。另一方面,我喜欢收集那些编译器选项与正常选项完全相反的系统之类的深奥知识。 - Jonathan Leffler
显示剩余2条评论

1
你可以简单地使用当前编译器的包含目录选项(通常为-I)来实现此目的。此外,请注意使用""双引号只会增加编译器标准头文件的后备。使用<>包括的文件仅保证搜索编译器标准头文件中的文件。

1

请参阅本答案以获取更完整的关于这两种格式差异如何工作的解释。不过,如果您需要上跳一个文件夹,然后再进入另一个文件夹才能获取所需内容,我认为您可能需要考虑重新构建文件夹层次结构。一般来说,将程序中所有文件保持本地化(即在同一个文件夹中),并将所有非本地文件(例如用于库的头文件)放在主程序文件夹的子文件夹中,或者在编译时包含它们,是一种常见的做法。

需要注意的是,在我上面链接的答案中,它解释了"<>"包含是实现依赖性的,因此我们真正需要知道您使用的编译器才能告诉您是否可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接