【问题标题】:#include – build fails after switching from <> to ""#include – 从 <> 切换到 "" 后构建失败
【发布时间】:2025-12-21 08:55:06
【问题描述】:

Nokogumbo gem 的 C 实现中的提交导致在 Gentoo Linux 上构建失败,但是,修改很小,不会造成任何问题。不幸的是,我在 zilch 旁边知道 C。

这是提交:

https://github.com/rubys/nokogumbo/commit/8b4446847dea5c614759684ebcae4c580c47f4ad

它只是将&lt;&gt; 替换为""

-#include <gumbo.h>
-#include <error.h>
-#include <parser.h>
+#include "gumbo.h"
+#include "error.h"
+#include "parser.h"

根据GCC docs,这不会造成任何麻烦,因为它会退回到以前的行为:

#include "file"

此变体用于您自己程序的头文件。它首先在包含当前文件的目录中搜索名为 file 的文件,然后在引用目录中搜索,然后在用于&lt;file&gt; 的相同目录中搜索。您可以使用 -iquote 选项将目录添加到引用目录列表中。

不幸的是,虽然它使用&lt;&gt; 编译得很好,但使用"" 构建失败:

compiling nokogumbo.c
nokogumbo.c:24:20: fatal error: parser.h: No such file or directory
#include "parser.h"

我想知道&lt;&gt;"" 的行为方式在多大程度上取决于工具链、环境和其他设置。

非常感谢您的提示!

【问题讨论】:

  • 这是不合规行为。如果包含" " 失败,编译器必须再次尝试,就像您编写了&lt; &gt; 一样。所以你的 gcc 出了点问题。
  • 如何从 IDE 或命令行调用 gcc?在 IDE:s 的情况下,可能会出现一些 IDE 打嗝,它会手动创建一个包含 -I 的包含路径,并且只将其传递给 gcc。命令行中的“Vanilla gcc”不应该有这些问题。

标签: c linux gcc include gentoo


【解决方案1】:

在 Gentoo 盒子上重新安装“gumbo”已经解决了这个问题。显然,本地安装混乱导致了这种奇怪的行为。

【讨论】:

    【解决方案2】:

    我检查了您的 git 存储库,发现您使用 --std=c99 编译代码。我认为这可能会导致问题,因为我在C99草稿中找到了这个:

    在实现定义的文件中搜索命名的源文件 方式。如果不支持此搜索,或者如果搜索失败,则 指令被重新处理,就像它读取一样

    #include <header>
    

    所以这意味着流程是第一个定义的实现,并且如果不支持它使用#include&lt;&gt; 模式。但这意味着如果它定义#include"" 搜索当前目录,它将停止搜索,如#include&lt;&gt;

    【讨论】:

    • 您误解了标准。 “或者如果搜索失败”很清楚,编译器必须再试一次,就像你写了&lt; &gt;一样。这也不是 C99 独有的,一直都是这样。
    最近更新 更多