高速的C/C++编译工具——ccache
1、简介
ccache(“compiler cache”的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。如果某头文件中包含对其他头文件的引用,ccache会用那个文件的 cpp-parsed版本来取代include声明,不是真正去读取、理解并解释其内容,ccache 只是将最终的文本拷贝到文件中,使得它可以立即被编译。ccache是以空间换取速度,ccache非常适合经常make clean(或删除out目录)后重新编译的情况。
2、安装与配置
(1)安装
apt-get install ccache
(2)查看安装位置
which ccache
(3)配置环境变量
在~/.bashrc(或/etc/profile)中添加:
#ccache
export USE_CCACHE=1
export CCACHE_SLOPPINESS=file_macro,include_file_mtime,time_macros
export CCACHE_UMASK=002
注:设置cache位置
默认情况下cache(缓存)会保存在~/.ccache目录下,如果要设置主目录位于NFS或其他非本地文件系统上,可获得更高的速度,如存储器支持,速度可提高10%到25%。在配置中添加如下配置:
# home/XXXXXX/.ccache XXXXXX是你的用户名
export CCACHE_DIR=<path-to-your-cache-directory>
(4)使配置生效
source .bashrc
(5)设置ccache大小
ccache -M 50G
ccache的大小是一个动态的值,每次改变.ccache文件的位置,max cache size都会被初始化。该设置会保存到CCACHE_DIR中,且该命令是长效的,不会因系统重启而失效。使用ccache第一次编译后能够明显提高make clean以后再次的编译速度。
(6)查看ccache版本信息
ccache --version
(7)查看ccache的信息
ccache -s
另:清除所有:ccache -C
3、使用ccache
ccache 主要是用来优化编译的。有两种方式使用ccache:
(1)选择性使用ccache:
使用"ccache gcc"或"ccache g++"代替"gcc"或"g++" ,以 gcc 为第一个参数调用 ccache,而不是调用gcc。例如,要在命令行中编译一个文件,您通常会使用:
$ gcc foo.c
要使用 ccache,您应该输入:
$ ccache gcc foo.c
像这样对一个文件进行单独的编译,尤其是第一次使用 ccache 编译那个文件时,您将不会看到有任何的帮助,因为编译信息还没有被高速缓存。
(2)ccache加入环境变量,取代C编译器:
设置 CC 环境变量的值,配置makepkg,进入到你的/etc/makepkg.conf中加入下面几行:
export CC="ccache gcc"
export CPP="ccache cpp"
export CXX="ccache g++"
或者直接在命令行输入:
$ export set CC='ccache gcc'
注:makepkg的更多配置参考:https://wiki.archlinux.org/index.php/Makepkg
(3)配置 ccache 永久地取代主要编译器:
vim ~/.bash_profile
把/usr/lib/ccache/bin路径加到PATH下:
PATH=/usr/lib/ccache/bin:$PATH
这只是对ccache所自带的gcc起作用,有时候我们需要使用交叉编译工具,这时,仅仅通过以上操作是无法执行ccache编译的,通常会提示xxx路径没有这个编译工具,这时需要这样做:
(a)查看安装路径
$ which ccache
(b)创建文件夹
$ mkdir ~/.bin
(c)设置链接
$ cd ~/.bin/
$ ln -s /usr/bin/ccache gcc
$ ln -s /usr/bin/ccache g++
$ ln -s /usr/bin/ccache arm-linux-gcc
$ ln -s /usr/bin/ccache arm-linux-g++
同理,其他编译工具类似方式指定。
(d)PATH设置
将~/.bin/放在 arm-linux-gcc等的PATH的前面。如:
// 原:
PATH=$PATH:$HOME/bin
// 现:
PATH=/home/用户名/.bin:$PATH:/home/用户名/ccache/bin
然后重启即可
(e)$ which arm-linux-gcc
/home//.bin/arm-linux-gcc 确认
这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++,效果跟使用命令行ccache g++效果一样。每次用户登录时,使用g++编译器时会自动启动ccache。
如果您只是想为一个项目启用 ccache,比如说编译 Perl 等第三方工具时,那么您或者可以使用第二种方式,或者可以告知配置脚本或 make 命令使用哪个C编译器。
4、控制高速缓存
默认情况下cache(缓存)会保存在~/.ccache目录下。此目录可自行修改。下面列举了一些选项让您可以更深入地控制高速缓存设置:
- CCACHE_LOGFILE :定义了使用高速缓存时生成的日志文件所处的位置;
- ccache -s:获得关于高速缓存性能的统计数据
- ccache -M:该命令行选项来设置高速缓存的最大大小。默认是 1GB。高速缓存的设置会写入到高速缓存目录,所以您可以让不同的用户和组在不同的位置拥有不同大小的高速缓存。
- ccache -F:该选项设置高速缓存目录的最大文件数目,按 16 进制舍入。和 -M 相同,只是当您希望改变配置的时候才需要使用它。
- ccache -c:该选项清空缓存。您通常不需要使用这个选项,因为 ccache 在执行过程中会更新信息,但是,如果您要重用一个没有为某个文件所使用的高速缓存目录,那么就应该尝试使用这个选项。
- ccache -C:该选项完全清空高速缓存。
5、组合 ccache 和 distcc
discc是Samba小组开发的一个工具,它让您可以将编译过程分布到多台机器上。只需要为 make 添加多任务选项(使用 -j 命令行选项),它就可以有效地提高同步编译的数目。distcc系统的工作方式是,每台主机上有一个后台进程,接收最终预解析格式的源文件,然后在本地进行编译,返回生成的对象文件。
如果使用得当,在每加入一个新的同样节点时,编译时间通常应该会以稍微低于线性的比率下降,不过您将只会在那些远不只一个源文件的项目上看到这样的影响,因为 distcc 只是分布全部源文件。
由于 distcc 所分布的是解析过的文件,所以您可以组合 ccache,它可以加速 C 预处理过程部分,同时distcc 可以完成到对象代码的实际编译。要以这种方式来使用 distcc 和 ccache,需要在主机上配置distcc,在主要的开发机器上配置 distcc 和 ccache。
使用 ccache 和 distcc 所需要的环境变量:
export set DISTCC_HOSTS='localhost atuin nautilus pteppic kernel'
export set CCACHE_DIR=/Data/Cache/CCache
export set CCACHE_PREFIX=distcc
export set CCACHE_LOGFILE=/Data/Cache/CCache.log
export set CC='ccache gcc'
环境变量定义如下:
- DISTCC_HOSTS 指定了将工作分布到哪些主机。
- CCACHE_DIR 指定了高速缓存目录的位置。
- CCACHE_PREFIX 定义了当 ccache 调用真实的编译器来编译源文件(预处理之后)时所使用的前缀。
- CC 设置首先使用的 C 编译器的名称(ccache)。
现在,当运行 make 时,如果使用了 -j 选项来指定要执行的同步编译的数目,则首先使用 ccache 解析文件(如果需要,使用高速缓存),然后将其分布到某个 distcc 主机。
尽管 distcc 加速了编译过程,但是它没有改变环境的基本限制。例如,您不应该将 make 执行的同步作业的数目设置得大于可用 CPU 数目的两倍。例如,如果您有四台两路机器,那么将作业值设置为超过 16 的值时将不再会观察到有多大改善。
参考:
更多推荐
所有评论(0)