原创 使用distcc和ccache缩短C/C++项目编译时间收藏

新一篇: 反应式处理超时事件 | 旧一篇: 可移植性最好的SNMP引擎

一个大型的C/C++项目的编译非常耗时。distcc和ccache这两个工具能够非常有效地压缩编译时间。它们并不是独立的编译器,而是配合GNU GCC使用(它们的资料明确说明并不关注其他编译器)。distcc介绍中说,有人完整编译KDE项目只花费6分钟。可见其厉害!此外,它们都非常易用,保证几分钟就能上手!

这两个项目的主页:
distcc            http://distcc.samba.org/
ccache            http://ccache.samba.org/

这两个软件的安装没什么好说的,都是标准的"./configure;make;make install"。

distcc工作原理:
distcc是一个分布式编译器。distcc仅仅加速了GCC的"-c",并不能加速link等。网络上若干主机运行distccd服务(占用标准端口3632),客户端用运行distcc将预处理完成的C/C++代码分发给这些服务器去编译,并且收集结果。

distcc使用举例:
(1)服务器端以普通用户执行“distccd --daemon --allow 10.0.0.0/16”。这使得distccd接受来自10.0网段的所有TCP连接。
注意:distcc文档中说"--allow 0.0.0.0"是接受所有连接--这已经过时,实际效果是拒绝所有连接!这时客户端和服务器端的表现:
客户端:
[kenny@kenny tmp]$ distcc gcc -o hello.o -c hello2.c
distcc[19490] (dcc_pump_sendfile) ERROR: sendfile failed: Connection reset by peer
distcc[19490] (dcc_readx) ERROR: unexpected eof on fd4
distcc[19490] (dcc_r_token_int) ERROR: read failed while waiting for token "DONE"
distcc[19490] Warning: failed to distribute hello2.c to 10.0.0.22, running locally instead
服务器端的日志:
[root@medusa kenny]# tail /var/log/messages
May  8 12:24:49 medusa distccd[868]: (dcc_check_client) connection from 10.0.15.120:51538
May  8 12:24:49 medusa distccd[868]: (dcc_check_client) ERROR: connection denied by access list
(2)客户端设置环境变量:
[kenny@kenny tmp]$ export DISTCC_HOSTS='localhost 10.0.4.3'
其中10.0.0.22为服务器的IP地址。可以把它放到~/.bashrc或~/.bash_profile中,使得用户一登录就设置好了这个环境变量。
(3)客户端执行:
[kenny@kenny tmp]$ distcc gcc -o hello.o -c hello2.c
注意:Only simple compiling with the -c option, not linking, is sped up, and that only C and C++ compiles are distributed.
所以distcc gcc -o hello hello2.c成功,实际上没有执行分布式编译!
对GNU make管理的工程:make -j8 CC=distcc或者在configure阶段执行"CC=distcc ./configure"(distcc将自动调用gcc;如果是arm交叉编译,则需要设置CC="distcc arm-linux-gcc")
对SCons管理的工程:scons -j8(SConstruct中应当设置CC,如CC='distcc gcc'或CC='distcc arm-linux-gcc')
我的IPCam项目用distcc(scons -j8,除localhost外有1个distcc服务器)后编译时间从53秒缩短为34秒。

ccache工作原理:
ccache缓存了GCC的“-E”选项输出,即预处理完成的C/C++代码。下次编译时尽量利用缓存。即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。

ccache用法:
对GNU make管理的工程:make CC=ccache或者在configure阶段执行"CC=ccache ./configure"(ccache将自动调用gcc)
对SCons管理的工程:SConstruct中应当设置CC,如CC='ccache'(distcc将自动调用gcc)或CC='distcc arm-linux-gcc'(如果是arm交叉编译)。
我的IPCam项目用ccache(SConstruct中应当设置CC,如CC='ccache arm-linux-gcc',scons命令行不变)后编译时间从53秒缩短为23秒!但是联合使用distcc和ccache的效果就和仅使用distcc一样--这可能是这个项目代码规模不够大,所以看不出效果。
 

发表于 @ 2007年05月08日 18:18:00|评论(loading...)|编辑

新一篇: 反应式处理超时事件 | 旧一篇: 可移植性最好的SNMP引擎

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © kenny_yu