【问题标题】:Question about include directory order in g++关于g ++中包含目录顺序的问题
【发布时间】:2009-08-07 17:07:28
【问题描述】:

不知何故,这是我在多年编程中第一次遇到这个问题,我不确定有什么办法来处理它。

我正在将应用程序移植到 Linux 的过程中,其中一个目录中有一个头文件,它显然与标准 C 库中的头文件同名,并且当“cstdlib”包含在该目录中的另一个文件,它试图包含本地文件,而不是标准库中的正确文件。

特别是,文件名为“endian.h”,它试图从/usr/include/bits/waitstatus.h 中包含。因此,它试图包含 ./endian.h,而不是包含 /usr/include/bits/endian.h。没区别

我唯一的选择是将项目中的 endian.h 重命名为其他名称吗,还是有一种方法可以强制编译器在与首先包含它的文件相同的目录中查找?


编辑:

好吧,这只是我的一个愚蠢的错误。我的 Makefile 设置为 -I。 ,所以它首先在当前目录中查找。哦。

【问题讨论】:

标签: c++ g++


【解决方案1】:

两者之间有一个重要区别:

#include "endian.h" // 首先查看当前目录。

#include // 查看标准搜索路径。

如果您想要当前目录中的那个,请使用引号。如果您想要系统,请使用尖括号。请注意,如果您通过“-I”标志将当前目录放在包含路径中,那么两者都可能解析为当前目录中的目录,在这种情况下,您不应在当前目录中使用“-I”。

【讨论】:

  • 我已更新问题以澄清这一点; #include 在标准库头文件中,它使用尖括号来包含它的依赖文件,但它在查看自己的路径之前先查看我的项目文件的路径。改变我的 #include cstdlib 方式在这里没有什么不同。
  • 其实你打到了,我查看了正在执行的实际g++命令,有一个“-I”。显然,自动工具正在我的 makefile 中生成它,现在我只需要弄清楚如何摆脱它。
  • 如果差别就这么简单。
  • 好吧,你可以做的就是把“endian.h”放到一个子文件夹中,这样,如果用尖括号完成,你必须把它包含在“#include ”。
  • 这是另一个想法,尽管我会尽快更改文件名。由于这是我不“拥有”原始文件的端口,因此我想避免更改任何现有文件的名称或位置。消除“-I”。在任何情况下,我的 Makefiles 都可以解决问题。
【解决方案2】:

如果用“”而不是包含文件,则应首先在包含它的文件所在的同一目录中查找文件头。

但是如果可能的话,重命名文件会更好恕我直言:如果文件被移动,当您更改构建系统等时,它将避免问题......“” vs 也取决于编译器(它不是C 标准要求其行为与 g++ 一样)。

【讨论】:

    【解决方案3】:

    也许你可以看看“-I”和“-I-”选项?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2018-12-09
      • 1970-01-01
      相关资源
      最近更新 更多