【问题标题】:How to get gcc to skip errors, but still output them.如何让 gcc 跳过错误,但仍然输出它们。
【发布时间】:2011-10-15 04:35:05
【问题描述】:

是否可以强制 gcc 报告错误,但继续编译过去?本质上,我试图在 .c 文件中生成错误列表,但 gcc 总是在第一个错误处终止。我已经在谷歌上搜索了一段时间,但据我所知,这并不是一个显而易见的问题。

【问题讨论】:

    标签: linux gcc makefile compiler-errors


    【解决方案1】:

    GCC 在无法继续前进时终止。

    如果编译器遇到错误,它必须猜测正确的代码应该是什么并尝试遵循。实际上,这意味着您总是需要修复第一个错误并重新运行编译,因为其余的都是无稽之谈。

    确保您没有打开-Wfatal-errors

    【讨论】:

    • 发帖人似乎愿意放弃任何已编译的输出以支持完整的错误列表。一些错误不会中断程序解析,即使它们会阻止输出。但其他人——比如不匹配的 () 或 {} 或 "" 可能需要大量的智能才能恢复到后续解析可能有意义的点。
    • 这是正确的,我现在不太关心输出对象,我只关心错误列表。大多数错误是因为我正在尝试为 ARCH=arm 而不是 x86 构建内核模块,并且其中有很多 x86 细节,即 rdtscl(读取时间戳计数器,它是 x86 特定的)所以通常代码结构和语法都很好。
    【解决方案2】:

    最新版本的 GCC 将尝试在可能的情况下跳过某些错误。

    假设 foo(){... 的主体包含 const-violation。翻译单元不会生成目标文件,但任何体面的编译器都会继续通过此错误进入bar(){...

    其他错误是不可恢复的。如果您遗漏了一些花括号,则无法合理猜测如何进行。

    【讨论】:

    • 编译器是否指示错误是否不可恢复?例如下面我将发布一些输出。 make 继续处理下一个对象,但不清楚上一个 gcc 错误是否导致该对象的编译终止,或者它是否确实继续但碰巧没有遇到任何错误。
    • CC [M] /home/stebar01/elba/crystalhd/07032010/driver/linux/crystalhd_lnx.o /home/stebar01/elba/crystalhd/07032010/driver/linux/crystalhd_lnx.c:356 :2:错误:在初始化程序/home/stebar01/elba/crystalhd/07032010/driver/linux/crystalhd_lnx.c:356:2中指定的未知字段'ioctl':警告:从不兼容的指针类型初始化[2]:[/ home/stebar01/elba/crystalhd/07032010/driver/linux/crystalhd_lnx.o] 错误1(忽略)CC [M] /home/stebar01/elba/crystalhd/07032010/driver/linux/crystalhd_hw.o
    • 我将 ioctl 的内容更改为 unlocked_ioctl 并且这个对象编译时没有大惊小怪,所以我认为上面显示了 gcc 继续通过错误的示例!谢谢解释
    【解决方案3】:

    来自gcc online doc

    -fmax-errors=n

    将错误消息的最大数量限制为 n,此时 GCC 会退出而不是尝试继续处理源代码。如果 n 为 0(默认值),则生成的错误消息的数量没有限制。如果还指定了 -Wfatal-errors,则 -Wfatal-errors 优先于该选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2014-01-27
      • 2019-07-09
      • 2019-06-01
      相关资源
      最近更新 更多