【问题标题】:Is there any way to get readable gcc error and warning output at the command line?有没有办法在命令行获得可读的 gcc 错误和警告输出?
【发布时间】:2009-03-17 23:27:02
【问题描述】:

对于一些较长的错误,gcc 输出很密集并且有很多换行等。尤其是当错误很细微时,我可能需要 10-30 秒的眯眼才能用我的眼睛解析它。

我已将其粘贴到打开的代码编辑器窗口中,以获得一些基本的语法突出显示并启用正则表达式重新格式化。

有没有人发明了一种更自动化的方法?

【问题讨论】:

  • 我只是把窗户弄得很宽...
  • 澄清:我喜欢英特尔的 c++ 编译器。信息干净、简短、有针对性。回到我还有许可证的时候,我会在使用 GCC 构建之前在英特尔的编译器中测试我的编译,只是为了找出大问题。
  • @Robert 我很感兴趣,希望我有机会尝试一下。不幸的是,不适用于当前项目...
  • 我的窗口和我的宽高比 21" 屏幕一样宽,字体尽可能小,当这已经不够用时,我来到了这里 ;)
  • 只有 10-30 秒?我要花更长的时间才能一直滚动到顶部才能看到疯狂的开始!

标签: c++ c gcc gcc-warning


【解决方案1】:

我使用这个脚本,叫做colorize:

#!/bin/bash
while read x ; do echo $x ; done \
| sed -e "s/.*error:.*/\x1b[1;36m&\x1b[0m/" \
-e "s/.*warning:.*/\x1b[1;36m&\x1b[0m/" \
-e "s/^\(.*\)\(required from\)/\x1b[1;36m\1\x1b[0mnote: \2/" \
-e "s/^\(.*\)\(In instantiation of\)/\x1b[1;36m\1\x1b[0mnote: \2/" \
-e "s/^\(.*\)\(In member\)/\x1b[1;36m\1\x1b[0mnote: \2/" \
| sed -e "s/error:/\x1b[1;31m&\x1b[1;36m/" \
-e "s/warning:/\x1b[1;35m&\x1b[1;36m/" \
-e "s/note:/\x1b[1;30m&\x1b[0m/"

然后我就这样称呼它(使用 make 或任何构建系统):​​

make |& colorize

我得到类似于 clang 的颜色输出。

【讨论】:

  • 这很好——它确实使消息更容易理解。另外,感谢您使用 |& 来管道 stderr——我以前从未见过。
  • 是否可以用更少的实用程序来使用它?
  • 有什么办法可以在 Windows 上得到这个?
  • @WscriChy 是的:make |& colorize | less 应该可以工作。
  • 您也可以将这些 sed 命令放在一个 sed 脚本中,并像这样调用它: make |& sed -rf colorize.sed 这将使 sed 脚本的维护变得更加容易。
【解决方案2】:

我发现colorgcc 非常宝贵。通过引入着色,精神上解析 gcc 错误消息的文本变得更加容易,尤其是在涉及模板时。

【讨论】:

  • 嘿,我用临时帐户发布了它,现在我无法跟进它,但我想说谢谢 - 这是一个很棒的实用程序,正是我正在寻找的那种为。
  • 我喜欢这个,但我更喜欢像 gccfilter 和 stlfilt 这样的消息简化,虽然 stlfilt 不做着色
  • colorgcc 是可破解的。您可以尝试修改其源代码以通过您喜欢的过滤程序运行它。
  • GCC 主干(将是 4.9)现在支持颜色诊断
【解决方案3】:

如果您的错误与模板相关,请查看 STLfilt:

【讨论】:

  • 迈克尔,与上面对福兹先生的回答的评论相同。你的答案是第一位的,而且它已经死了——这些模板错误正是我的帖子的灵感来源。我将从明天开始使用 STLfilt,直到我死。顺便说一句,我使用我的新功能帐户投票支持你们两个。再次感谢。
  • FWIW,我发现 MS 的较新编译器不需要像 STLfilt 之类的东西 - 它们现在开箱即用地提供非常易读的错误消息。
  • 这很好,但我更喜欢像 colorgcc 或 gccfilter 那样对输出进行着色。
【解决方案4】:

gccfilter 对消息进行着色和简化。

http://www.mixtion.org/gccfilter/

【讨论】:

  • 我喜欢这个做着色和消息简化,但我似乎无法将 g++ 符号链接到它(以便make 使用它)。有什么建议吗?
  • dolan:在“/usr/local/bin”(或 $PATH 中实际 gcc 位置之前的其他位置)中创建一个指向包装脚本的符号链接,例如:/path/to /your/gccfilter -c "/path/to/actual/gcc" "$@"
  • @dolan:如果您使用的是 makefile,这是另一个选项:将 g++ 定义为“CC=$(MY_CC_PREFIX) g++”。然后,将 MY_CC_PREFIX 定义为“/path/to/gccfilter ”。这使您可以轻松更改传递给 gccfilter 的参数。此外,如果未定义 MY_CC_PREFIX,您将按预期使用 g++。
【解决方案5】:

如果您使用 GCC 4.9,您可以添加 -fdiagnostics-color=auto 作为附加编译标志。在以后的一些版本中,默认启用了颜色。

【讨论】:

    【解决方案6】:

    检查diagcc,你可以得到这样的东西:

    如果你的 gcc ≥ 4.9,你可以使用参数-fdiagnostics-color=always

    【讨论】:

    • 请注意,现代版本的 gcc 已经内置了颜色功能。
    【解决方案7】:

    要在 4 年后回答您的问题,此处应提及 clang

    【讨论】:

      【解决方案8】:

      这是我目前的 hack,它主要在战略位置插入换行符和缩进以及一些额外的注释,但没有解决 STL 冗长问题。

      请注意,在当前实现的情况下,如果编译器返回错误,则此脚本不会返回错误,因此执行此类操作将无法正常工作: (make && ./runApplication)。这肯定可以通过更好的 bash-fu 来解决。

      #!/bin/bash
      # SUBSTITUTION RULES:
      # Note: All substitution rules must end in a semi-colon, inside of the closing quote
      subColonSpace='s/: /:\n /g;'
      subSrc='s/^src/\nsrc/;'
      subError='s/error:/error:\n\n======================================\nERROR:/;'
      subWarning='s/ *error: *\n/ERROR: /;'
      subWarning='s/ *warning: *\n/WARNING: /;'
      subNote='s/note:/\n NOTE:/g;'
      subOpenTic='s/‘/\n   ‘/g;'
      subOpenParen='s/(/(\n      /g; s/(\n *)/()/g;'
      subCommaSpace='s/, /,\n      /g;'
      
      # Note: The order of these may matter
      sedExpr="$subColonSpace $subSrc $subError $subWarning $subNote $subOpenTic      
      $subOpenParen $subCommaSpace"
      
      makelogFile=makelog.tmp
      
      make "$@" 2>&1 | sed "$sedExpr" | tee $makelogFile
      

      【讨论】:

        【解决方案9】:

        如果你喜欢 Ruby,这里有 GilCC! GilCC 非常易于安装(只需将其复制到 bin 文件夹中)且易于使用(只需键入 GilCC 而不是“gcc”或“make”)并且它适用于 GCC 版本。与基于 Perl 的脚本不同,GilCC 具有诸如警告和错误数量以及编译时间等统计信息。你不必弄乱 .bash 文件,只要你能在你的机器上运行 Ruby,它就是跨平台的。由于它具有 Ruby 的强大功能;您可以让 GilCC 在成功构建后执行不同的操作,例如触发测试自动化、单元测试或编程外部硬件。

        这里是下载页面的链接:http://www.onlysolutionssoftware.com/gilcc/

        【讨论】:

          猜你喜欢
          • 2017-08-16
          • 1970-01-01
          • 1970-01-01
          • 2019-10-09
          • 1970-01-01
          • 2021-03-15
          • 2019-09-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多