有没有办法在发出错误时使gcc打印违规行?

时间:2010-06-04 18:29:06

标签: gcc 64-bit porting

我有一个很大的代码库,我的任务是移植到64位。代码编译,但它打印了大量不兼容的指针警告(正如预期的那样。)有没有办法让gcc打印出错的行?在这一点上,我只是使用gcc的错误消息来尝试追踪需要修改的假设,并且不得不查找每一个都不好玩。

6 个答案:

答案 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)

使用-W选项控制要显示的警告。此参数解释了here

此外,您可以使用此技巧来抑制渐进式输出:

gcc ... 1>/dev/nul

答案 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
}