改善g++输出

49

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

也许在这里提出这个问题听起来很傻,但我一直无法通过谷歌找到答案。


可能是重复的问题。请参见https://dev59.com/0HVD5IYBdhLWcg3wOo5h。 - Fred Larson
10个回答

44

从4.9版本开始,GCC支持彩色输出 ☺

请将以下内容添加到您的bashrc/zshrc/任何其他配置文件中。

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

7
如果您正在通过管道构建系统运行,请使用-fdiagnostics-color-fdiagnostics-color=ALWAYS编译。 - Qix - MONICA WAS MISTREATED
我认为 Qix 把 ALWAYS 大写是为了强调,但读者应该注意它应该是 -fdiagnostics-color=always,否则你可能会收到一个错误提示说 ALWAYS 是未识别的参数,有效的参数是 alwaysautonever - drwatsoncode
似乎对我来说在使用g++(通过ninja构建系统编译)无法工作。 - Caleb Stanford

39

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

否则,如Matteo Italia所指出的,可以查看STLFilt

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


2
自从我提出这个问题并得到你的答案以来已经过了很长时间。在整理书签时偶然发现了它,并意识到我从未对这个问题进行评论。为了将来的参考,我确实尝试了clang++,并且非常惊喜于更清晰的编译器输出:)谢谢! - salezica
1
对于颜色方面,我发现colout更易于使用,而且它的g++主题比colorgcc更好看。它还可以在错误消息中进行语法着色,并且其文本流方法允许混合几个命令的彩色输出(例如从CMake的makefile调用的g++并使用grep过滤)。 - nojhan
谢谢这个。作为一个额外的好处,clang默认情况下会对其输出进行着色(假设您在makefile中设置了CXX=clang)。我很高兴。 - Daniel Hanrahan

12

有一个名为 colorgcc 的perl脚本,它可以使用颜色使gcc(g++)的输出更易读。

至于gcc(g++)的"output",我猜你并不是在抱怨已编译二进制文件的问题 :)


嗯,有趣,我会看一下。 - Matteo Italia

11

我使用sed命令使用以下脚本来突出显示输出内容:

我用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/"

1
听起来很有趣,但是我无法让它工作。例如,make | colorize(其中colorize是您的脚本)是单色的。这应该如何使用? - Ami Tavory
2
使用 make |& colorize - Paul Fultz II
2
哦,着色脚本,你在我(职业生涯)的所有时间里都去哪了? - Ami Tavory

6

4

当处理STL1时,STLFilt可以提供帮助。

另外,我也听说clang编译器通常会产生更好的错误信息。


吹毛求疵的角落

  1. 实际上,并不是SGI STL,而是其中已被采用并成为标准库一部分的部分。

2

我不能直接回答你的问题,但请注意,关于模板,如果你看一下顶部信息(由模板引起的错误)和底部“从这里实例化”的信息,通常会变得更加清晰。请忽略所有中间的信息,因为它们可能不会有帮助。


1
这是我的个人函数:

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; '
}

1

0

你可以使用GilCC,这是一个Ruby工具,可以实时将GCC输出转换为彩色。它是免费的,你可以根据自己的喜好进行定制。它不会干扰你的gcc设置,也不需要编辑任何系统文件,如.bash。你需要安装Ruby并能够从命令行调用Ruby程序。现在你有两个选择:Perl脚本或GilCC,如果你使用Ruby,你会喜欢GilCC。

然后,每当你调用"GillCC"时,它会在后台使用你的参数(如"clean"、"debug"或"release")调用"make"。例如,如果通常你调用:"make debug",那么你应该调用"GilCC debug"。

几乎忘了提到,GilCC还有一些统计数据,如警告和错误数量以及构建时间。当你试图改进你的构建时,这些东西非常方便。

下载页面链接在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接