我有一个很大的代码库,我的任务是移植到64位。代码编译,但它打印了大量不兼容的指针警告(正如预期的那样。)有没有办法让gcc打印出错的行?在这一点上,我只是使用gcc的错误消息来尝试追踪需要修改的假设,并且不得不查找每一个都不好玩。
答案 0 :(得分:2)
也许打印所需线条的脚本会有所帮助。如果您使用的是 csh (不太可能!),请使用:
make ... |& show_gcc_line
使用show_gcc_line
以下脚本:
#!/bin/csh
# Read and echo each line. And, if it starts with "foobar:123:", print line 123
# of foobar, using find(1) to find it, prefaced by ---------------.
set input="$<"
while ( "$input" )
echo "$input"
set loc=`echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p'`
if ( $#loc ) then
find . -name $loc[1] | xargs sed -n $loc[2]s/^/---------------/p
endif
set input="$<"
end
对于 bash ,请使用make ... 2>&1 | show_gcc_line
:
#!/bin/bash
# Read and echo each line. And, if it starts with "foobar:123:", print line 123
# of foobar, using find(1) to find it, prefaced by ---------------.
while read input
do
echo "$input"
loc=$(echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p')
if [ ${#loc} -gt 0 ]
then
find . -name ${loc% *} | xargs sed -n ${loc#* }s/^/---------------/p
fi
done
答案 1 :(得分:2)
我公然偷走了Joseph Quinsey的answer。唯一的区别是我试图让代码更容易理解:
对于bash,请使用make 2>&1 | show_gcc_line
show_gcc_line
以下脚本:
#!/bin/bash
# Read and echo each line only if it is an error or warning message
# The lines printed will start something like "foobar:123:" so that
# line 123 of file foobar will be printed.
while read input
do
loc=$(echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p')
len=${#loc}
file=${loc% *}
line=${loc#* }
if [ $len -gt 0 ]
then
echo "$input"
echo "$(sed -n ${line}p $file)"
echo
fi
done
这部分是因为我不喜欢原版的格式。这只会打印警告/错误,然后是导致问题的代码行,后跟一个空行。我也删除了连字符串。
答案 2 :(得分:1)
答案 3 :(得分:0)
当编译器发出错误消息时,实际的源代码行已经过去了(特别是在C中) - 它已经转换为令牌流,然后转换为抽象语法树,然后转换为装饰语法树。 .. gcc有足够的编译步骤,所以它故意不包括重新打开文件和重新检索原始源的功能。这就是编辑器的用途,几乎所有编辑器都有命令启动编译并跳转到按键时的下一个错误。帮个忙,使用现代编辑器浏览错误(甚至可以半自动修复它们)。
答案 4 :(得分:0)
这个小脚本应该可以工作,但我现在无法测试它。抱歉,如果需要编辑。
LAST_ERROR_LINE=`(gcc ... 2>&1 >/dev/null ) | grep error | tail -n1`
FILE=`echo $LAST_ERROR_LINE | cut -f1 -d':'`
LINE=`echo $LAST_ERROR_LINE | cut -f2 -d':'`
sed -n "${LINE}p" $FILE
答案 5 :(得分:0)
对我来说,重定向错误消息的符号很难记住。
所以,这是我打印出gcc错误消息的版本:
$ee make
错误和警告消息:
ee2 make
如何: 将这些添加到.bashrc
function ee() {
$* 2>&1 | grep error
}
function ee2() {
$* 2> ha
echo "-----"
echo "Error"
echo "-----"
grep error ha
echo "-------"
echo "Warning"
echo "-------"
grep warning ha
}