如果你现在or将来的工作会和一个巨大的工程相关,那么本文的方法值得一试。比如一个工程成百上千个文件夹,涉及的源文件也是数不胜数,并且更让人伤心的事情是这些文件中因为若干历史原因保留在那里,但压根就和编译需要的东西八竿子打不着。这个时候,你怎么知道当前的工程到底编译了哪些文件呢?毕竟我们要熟悉工程需要从源文件入手。
方法一:
曾经我这么干过:
改makefile,大型工程都是用这个东东,如果你还不知道这个东东,那应该好好补习补习功课了哦,呵呵
有些时候,为了编译结果的输出好看,在makefile中将编译语句的输出禁用掉了,即在编译命令前加@,如
上面的例子,在编译的.c的时候就不会输出正在编译的文件了,去掉前面的@即可让arm-linux-gcc在编译的时候显示正在编译的文件,输出大概类似这样的(内容是我杜撰的,请勿对号入座):
gcc -c -g -O2 -DYY -o /some/path/to/target/xxx.o /some/path/to/source/xxx.c
这样我们就可以知道编译的文件了。
并且 make -n >make.log 可以直接将这些过程记录到make.log中进行分析,真是太方便了。
不过,还是高兴得太早了,因为大型的工程里面到处都是 make -C /some/sub/director/
这样一来,要是人家在子目录里面makefile来一句这样的东东:
@$(CC) -c $(CFLAGS) -o $@ $<
在CC前面来了个@,那我们就可能少得到一些文件,呜呼,吐血而亡。
如果你是比较“勤快”的人,可以把所有的子目录的makefile看一遍,然后逐一修正。该工作量可能也是非常巨大的。
我比较“懒”,这个方法不想用,其实主要是工程太大,子目录层层叠叠,太多了,看完估计头发都白了几根,呵呵
方法二:
懒人的方法:
原理:既然所有的编译都是用同一个编译器(什么,居然还用了两个编译器,哈哈,那也没关系,继续看吧),那么我们能不能再编译器上动点手脚呢,答案是可以并且可行,只要一个脚本即可搞定,哈哈。这可是偶在车上灵机一动想出来的,不会有人已经想到了吧。不过郁闷的是今天晚上回来坐车坐错了,本来10分钟就可以到家的,结果用了40多分钟,不过正是这多浪费的时间,才想到这个的,真是福祸相依啊,晕,扯远了,回归正题,看下面的脚本文件
比如要对付前面提到的arm-linux-gcc编译器,那么脚本文件就使用上面列举的代码,并且该脚本文件要命名为arm-linux-gcc,然后将该脚本文件放在环境变量$PATH最前面的路径中去,什么,你没有权限?那就重新加一个,like this: export PATH=/directory/of/shell/script/arm-linux-gcc/:$PATH
这里要注意看看工程里面makefile是否有重新设置环境变量顺序,目的只有一个:让我们的这个脚本的要先于系统真正的编译器执行 ,可以使用which arm-linux-gcc 来查看是否设置正确。
然后,然后就等着看结果吧,打开/home/mayer/gcc_build.log这个文件就可以看到我们想要的东东了。
当然,该脚本不会妨碍真正的编译过程,同理你也可以跟踪其他的一些文件。
以上方法基于linux平台,当然,用同样的原理也可在window上实现,不过windows上要劫持编译器,可以用镜像劫持执行一个批处理达到目的。
太晚了,还没测试的,不过应该是没有问题的,欢迎拍砖。
早上来测试发现脚本有点问题,已经修正,功能完全正常,哈哈