【问题标题】:Improving g++ output改善 g++ 输出
【发布时间】:2011-04-20 15:08:51
【问题描述】:

g++ 有时会产生相当复杂的输出。特别是在处理模板时。是否有任何工具可以使 g++ 输出更具可读性? ...至少有一些颜色?

在这里问这个问题可能听起来很傻,但我一直无法通过谷歌搜索。

【问题讨论】:

标签: c++ g++


【解决方案1】:

从 4.9 开始的 GCC 具有彩色输出 ☺

将以下内容附加到您的 bashrc/zshrc/whatever。

export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

【讨论】:

  • 如果您正在通过管道构建系统运行,请使用 -fdiagnostics-color-fdiagnostics-color=ALWAYS 进行编译。
  • 我认为 Qix 大写 ALWAYS 是为了强调,但读者应该注意它应该是 -fdiagnostics-color=always 否则你可能会收到一个错误,说 ALWAYS 是一个无法识别的参数,而有效的参数是 alwaysautonever
  • g++ 似乎对我不起作用(通过 ninja 构建系统编译)
【解决方案2】:

如果您可以随意切换编译器,请尝试clang++。它的错误输出大部分时间都非常清晰,有时它甚至会告诉您如何修复错误。您可以在此处找到 gcc 与 clang 错误输出的比较:http://clang.llvm.org/diagnostics.html

否则,如 Matteo Italia 所述,请查看 STLFilt

对于颜色方面,Edwin Buck 的解决方案 (colorgcc) 非常好。您可以为其创建名为 gcc、g++ 等的符号链接,以便在您运行编译器命令时始终使用它(前提是您正确设置了 colorgcc 脚本中的路径)。从 Makefile 编译一些大型项目时,我发现这特别方便。极大地帮助检测到底哪里出了问题(尤其是当您使用 make -j 进行并行编译时)。

【讨论】:

  • 我已经很久没有问这个问题并接受你的回答了。我在清理书签时偶然发现了它,并意识到我从未评论过这个问题。为了将来参考,我确实尝试了 clang++,并且对更干净的编译器输出感到最惊喜:) 谢谢!
  • 在颜色方​​面,我发现colout 更易于使用,而且它的 g++ 主题比 colorgcc 更好看。它还在错误消息中进行语法着色,其文本流方法允许混合多个命令(例如从 CMake 的 makefile 调用并使用 grep 过滤的 g++)对输出进行着色。
  • 谢谢。作为奖励,默认情况下,clang 会对其输出进行着色(假设您在 makefile 中设置了CXX=clang)。我很高兴。
【解决方案3】:

colorgcc 是一个 perl 脚本,它用颜色包装 gcc (g++) 输出以便于阅读。

至于 gcc (g++) 的“输出”,我猜你不会抱怨编译后的二进制文件 :)

【讨论】:

  • 呃,有意思,我去看看。
【解决方案4】:

我通过使用 sed 使用此脚本为输出着色来改进它:

#!/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 | colorizecolorize 是您的脚本)是单色的。这将如何使用?
  • 使用make |& colorize
  • 哦,给脚本上色,我(职业)一生都去哪儿了?
【解决方案5】:

如果您使用 gcc 4.9 或更高版本,则有几个内置选项:

  • -fmessage-length=n,优化 n 个字符长度的行的输出。
  • -fdiagnostics-color=always,它会应用一些漂亮的颜色。
    (在 linux 上运行良好,在 msys 上运行良好)

有关更多选项和确切用法,请参阅文档:
https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html

【讨论】:

    【解决方案6】:

    在处理 STL1 时,STLFilt 会派上用场。

    在相关的说明中,我还听说 clang 编译器通常会产生更好的错误消息。


    吹毛求疵者的角落
    1. 实际上,不是 SGI STL,而是它的部分已经被 C++ 标准采用并且是标准库的一部分。

    【讨论】:

      【解决方案7】:

      我无法直接回答您的问题,但请注意,关于模板,如果您查看顶部消息(由模板引起的错误)和底部“从此处实例化”消息,通常会变得更加清晰.忽略所有中间消息,因为它们可能无济于事。

      【讨论】:

        【解决方案8】:

        colorgcc

        【讨论】:

          【解决方案9】:

          这是我的个人功能:

          colorgcc()
          {
          perl -wln -M'Term::ANSIColor' -e '
          m/not found$/ and print "\e[1;30m$`\e[0m", "$&", "\e[0m"
          or
          m/found$/ and print "\e[1;30m$`\e[0;32m", "$&", "\e[0m"
          or
          m/yes$/ and print "\e[1;30m$`\e[0;32m", "$&", "\e[0m"
          or
          m/no$/ and print "\e[1;30m$`\e[0m", "$&", "\e[0m"
          or
          m/ Error |error:/i and print "\e[1;91m", "$_", "\e[0m"
          or
          m/ Warning |warning:/i and print "\e[0;33m", "$_", "\e[0m"
          or
          m/nsinstall / and print "\e[0;36m", "$_", "\e[0m"
          or
          m/Linking |link: |\.a\b/ and print "\e[1;36m", "$_", "\e[0m"
          or
          m/Building|gcc|g++|\bCC\b|\bcc\b/ and print "\e[1;30m", "$_", "\e[0m"
          or
          print; '
          }
          

          【讨论】:

            【解决方案10】:

            您可以使用 GilCC,这是一个 Ruby 工具,可将 GCC 输出实时转换为颜色。它是免费的,您可以根据自己的喜好对其进行自定义。它不是侵入性的,因为它不会更改您的 gcc 设置,并且您不必编辑任何系统文件,例如 .bash。您必须安装 Ruby 并能够从命令行调用 Ruby 程序。现在您有两个选择 Perl 脚本或 GilCC,如果您使用 Ruby,您会喜欢 GilCC。

            然后,每当您调用“GillCC”时,它都会在后台调用“make”,并带有您的参数,例如“clean”、“debug”或“release”。例如,如果您通常调用:“make debug”,则应调用“GilCC debug”。

            差点忘了提到 GilCC 有一些统计信息,例如警告和错误的数量以及构建时间。当您尝试改进构建时,这些东西会很方便。

            下载页面的链接是here

            【讨论】:

              猜你喜欢
              • 2020-10-18
              • 2014-10-30
              • 2016-04-22
              • 1970-01-01
              • 1970-01-01
              • 2015-10-09
              • 1970-01-01
              • 2017-08-29
              • 2019-01-28
              相关资源
              最近更新 更多