【问题标题】:C++ include with full pathC++ 包含完整路径
【发布时间】:2014-05-09 11:00:01
【问题描述】:

我发现#include "../app/thing.h" 非常丑陋,我希望能够从我的项目的主根目录导入,如下所示:

#include <project/app/submodule/thing.h>

(我知道一般用于外部,但我觉得它很干净)

我怎样才能在我的项目中的任何地方做到这一点?

【问题讨论】:

标签: c++ include include-path


【解决方案1】:

您可以简单地使用当前编译器的包含目录选项(通常为-I)来实现这一点。

还请注意,使用"" 双引号只会添加到编译器标准头文件的后备。使用<> 包含的文件只能保证从编译器标准头文件中搜索文件。

【讨论】:

    【解决方案2】:

    您只需要确保您的构建过程设置一个选项来指定搜索的起点。

    例如,如果您的标题位于:

    /work/username/src/project/app/submodule/thing.h
    

    那么您需要包含(假设是符合 POSIX 的编译器;AFAICR,甚至 MSVC 都使用 /I 作为 -I 的类似物):

    -I/work/username/src
    

    作为编译器选项之一。您可以在项目中的任何位置使用该路径,因为它是绝对的。您只需要为您的构建系统定义一种方式来了解设置应该是什么,这样当它移动到/home/someone/src/ 时,您只需更改一个设置。

    【讨论】:

    • 不一定每个编译器都使用-I
    • 在不是-I的Windows上指定一个编译器?我在答案中添加了一个警告 - 并提到我相信 Windows 使用 /I,因为那里的选项以 / 而不是 - 开头。
    • 我还没有遇到不使用-I的编译器,但当然也有可能没有编译器。甚至 MS 编译器也采用 -I(即使他们“更喜欢”/I)
    • 在问题的任何地方都提到了窗口。有一些奇特的工具链为此功能使用不同的选项。
    • @πάνταῥεῖ — 好的;而且你不会给出这样一个奇特工具链的任何例子,所以除非我们碰巧遇到它,否则我们永远不会知道你在想什么?一方面,我并不担心;我已经涵盖了绝大多数实际案例。 OTOH,我喜欢收集类似系统的深奥知识,其中编译器选项与普通选项相比都是 whacko。
    【解决方案3】:

    请参阅this answer,了解有关这两种格式之间的差异如何运作的更完整说明。不过,老实说,我认为如果您需要向上跳转一个文件夹然后跳转到另一个文件夹以获取某些内容,那么您可能需要考虑重构您的文件夹层次结构。一般来说,将程序本地的所有文件保存在文件夹结构中(即在同一个文件夹中)和所有非本地但可能需要的文件(例如用于使用的库)在主程序文件夹的子文件夹中,或在编译时包含它们。

    重要的是要注意,在我上面链接的答案中,它解释了“”包含是依赖于实现的,所以我们真的需要知道你使用什么编译器来告诉你是否可以或不能不要那样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2019-01-25
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多