Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315331
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-06-09 01:24:23

gcc选项之多, 我已知这个世界上只有另几个程序可以与之相提并论: pc-lint, imagemagick 命令行工具.

但是, 如果你想让它输出的警告信息中使用绝对路径名, 而不是仅仅文件名部分, 却发现它竟没有这么一个选项. 一番搜罗之后, 只看到一个mail list中有人提出相同需求, 自问自答看来gcc没有这个选项, 在info gcc中, 也没找到full path, absolute path相关的选项.

假设它的确没有吧. 我还是会需要这一功能. 原因很简单: 我在查看所有的make.log时希望在vim中直接用f即可打开文件, 稍加调校, 最好还能定位到出错的那一行, 如果只有文件名部分, 可就麻烦了, 一则, 文件名, 可能位于某个子目录, 更麻烦的情况, 我在项目中偏偏就碰到了, 不同子目录下使用同样的文件名, 项目一大, 这种做法很让人烦.

先观察现有的make过程, 用的是哪个命令行, 一般来说, 一个make过程, 只会使用统一的一个编译器程序名, 如cc或gcc

which cc
在我的RedHat Linux上, 它位于/usr/bin 下.

查看$PATH, 一般来说/bin 列在/usr/bin之前,
hash -r
让bash 忘掉它曾在/usr/bin下成功找到过cc这回事, 下次使用时从头找.

cat > /bin/cc <#!/bin/bash

#set -x
ARGS=
for i in "$@"; do
    if [[ "$i" =~ '^[^/]+\.c$' ]]; then
        full_fname=$(cd $(dirname "$i");pwd;)/$(basename "$i")
        ARGS="$ARGS  $full_fname"
    else
        ARGS="$ARGS $i"
    fi
done
eval /usr/bin/gcc $ARGS
END


chmod a+x /bin/cc

再执行make即可

要点在于, 把每个实际进行编译的命令中含有的.c文件名部分, 用它的绝对路径替换, gcc在输出警告/错误信息时, 使用命令行上"看到"的文件名, 手工把绝对路径给它, 它自然就原样输出.

缺点: gcc有时会输出存在于.h 文件中的警告信息, 而.h文件往往是以相对路径的形式#include的, 所以.h文件的路径还是无法被改变.


阅读(1674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~