高速C/C++编译工具(ccache)
http://blog.163.com/liuhonggaono1@126/blog/static/10497901201210254622141/
好久没有写总结了,陌生了这博客,也陌生了文字,只觉得工作后的人生就再也不只是生活了!现在的我,在为生活而工作与为工作而生活的纠结中,几乎快要迷失了自我,偶尔偷闲,写点东西,歇歇脚,明天继续赶路。。。。。。
ccache的主页:http://ccache.samba.org
distcc的主页:http://distcc.samba.org
1、背景:
在处理一些规模相对较大的工程时,编译花费的时间可能会很长。有时候我们会经常一遍一遍地编译相同的程序,此时,有了ccache情况就好多了。它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍(5-10倍)的提速。
ccache 的基本原理是通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度。以下来了解下如何同时使用 ccache 和distcc 来使开发环境达到最佳性能。
2、引入ccache:
在标准的编译过程中,在 UNIX 下使用 C/C++ 开发应用程序通常需要用到一个编译器(如 gcc)以及一个编译工具(如 make)。make 和所有的 C 编译器的问题在于 C 预处理程序(preprocessor)和头文件的工作方式。观察一个典型的 C 源文件,您会发现其中有很多由 #include 所引用的各种头文件。每一次编译一个文件时,C 预处理程序(cpp)都会解析并引入每个头文件以及这些头文件引用到的任何文件。通过对内容进行解析,cpp 可以将一个相当基本的 1-KB 大小的源文件转化为一个 8-KB 大小的源文件,在这个过程中,会合并入几十个甚至几百个头文件。在典型的开发项目中,有很多与项目相关的头文件可能会在不同的源文件中多次被引入,而且每个头文件本身也可能引用很多其他头文件。这就是我们使用了N年的C编译器的基本编译理念,从C出现到如今,它带给人们无数编译成果的同时,也逐渐暴露出自身固有的缺憾。
在典型的编译过程中,make 工具只编译自上次编译后发生修改的文件,这样就在很大程度上简化了编译过程。make 将必须被编译的文件限制在经过修改的那些源文件范围之内,但是即使是使用 make,仍然有相当的浪费。每一次编译项目时,源文件在编译为汇编语言和最终的机器代码之前,都要通过 cpp 进行解析。对每一个文件来说,每一次可能都要重新解析头文件,由此上面提到的问题再次出现。从编译的全过程来看,您最后可能多次解析了相同的头文件,浪费了处理器周期,更浪费了开发时间。
3、 ccache基本原理:
ccache(“compiler cache”的缩写)也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。
ccache工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。举例编译Example,假定 foobar.h 中包含对其他头文件的引用,ccache 会用那个文件的 cpp-parsed 版本(已编译过并被ccache缓存在cache中的备份)来取代 include 声明,而不是真正去读取、理解并解释其内容,ccache 只是将缓存在高速缓存中最终的文本拷贝到文件中,使得它可以立即被编译。
Example:
#include "foobar.h"
void main(void)
{
}
4、安装
安装和使用 ccache很简单。首先说明一点,ccache它不会取代或者以任何方式影响您原来的使用编译器的方式,而是担当了您与您的编译器之间的一个接口,所以您可以根据需要选择是否使用它。要安装 ccache,需要从 Samba 小组或者一个本地镜像直接下载源文件。解压出文件的内容:
1)、单机安装方法:
首先解压:
$ bunzip2 -c ccache-2.3.tar.bz2|tar xf -
2)、若情况为多人共用服务器,自己只是服务器的一个普通用户,除非你拥有root权限,或者root允许使用sudo,否则要安装到用户目录下,这时步骤如下:
$ ./configure –prefix=~/My_Software/ccache/
前面提到,ccache 是充当您与您的普通编译器之间一个借口来优化编译的。有两种方式使用ccache:
使用"ccache gcc"或"ccache g++"代替"gcc"或"g++" ,以 gcc 为第一个参数调用 ccache,而不是调用 gcc。例如,要在命令行中编译一个文件,您通常会使用:
像这样对一个文件进行单独的编译,尤其是第一次使用 ccache 编译那个文件时,您将不会看到有任何的帮助,因为编译信息还没有被高速缓存。
设置 CC 环境变量的值,配置makepkg,进入到你的/etc/makepkg.conf中加入下面几行:
makepkg.conf里还有不少东西可以修改,详情参见原文:
http://wiki.archlinux.org/index.php/Makepkg.conf
PATH=/usr/lib/ccache/bin:$PATH
这只是对ccache所自带的gcc起作用,有时候我们需要使用交叉编译工具,这时,仅仅通过以上操作是无法执行ccache编译的,通常会提示xxx路径没有这个编译工具,这时需要这样做:
$ ln -s /usr/bin/ccache arm-linux-gcc
$ ln -s /usr/bin/ccache arm-linux-g++
D、PATH设置,将~/.bin/放在 arm-linux-gcc等的PATH的前面。
现:PATH=/home/用户名/.bin:$PATH:/home/用户名/ccache/bin
/home/<user>/.bin/arm-linux-gcc 确认
如果您只是想为一个项目启用 ccache,比如说编译 Perl 等第三方工具时,那么您或者可以使用第二种方式,或者可以告知配置脚本或 make 命令使用哪个 C 编译器。
CCACHE_LOGFILE :定义了使用高速缓存时生成的日志文件所处的位置。
在 ccache 中使用 -s 命令行选项来获得关于高速缓存性能的统计数据。
使用 -M 命令行选项来设置高速缓存的最大大小。默认是 1GB。高速缓存的设置会写入到高速缓存目录,所以您可以让不同的用户和组在不同的位置拥有不同大小的高速缓存。
-F 选项设置高速缓存目录的最大文件数目,按 16 进制舍入。和 -M 相同,只是当您希望改变配置的时候才需要使用它。
-c 选项清空缓存。您通常不需要使用这个选项,因为 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
CCACHE_PREFIX 定义了当 ccache 调用真实的编译器来编译源文件(预处理之后)时所使用的前缀。
现在,当运行 make 时,如果使用了 -j 选项来指定要执行的同步编译的数目,则首先使用 ccache 解析文件(如果需要,使用高速缓存),然后将其分布到某个 distcc 主机。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(66) | 评论(0) | 转发(0) |
上一篇:摩托罗拉MB526— Android 4.4.4 — 包含的共享库文件 —lib*.so
下一篇:(OK) CentOS7 安装 Codeblocks
- config.h文件中#undef的用处,...
- FreeBSD下zfs: failed with er...
- MySQL执行计划分析工具EXPLAIN...
- 欢迎高速限速在ChinaUnix博客...
- gradle编译安装引发的java安装...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
高速C/C++编译工具(ccache)相关推荐
- c语言cache,高速C/C++编译工具ccache
1.背景: 在处理一些规模相对较大的工程时,编译花费的时间可能会很长.有时候我们会经常一遍一遍地编译相同的程序,此时,有了ccache情况就好多了.它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍 ...
- 高速的C/C++编译工具——ccache
1.简介 ccache("compiler cache"的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通 ...
- ccache 3.1.9 发布,高速C/C++编译工具
ccache 3.1.9 修复了一些 bug,包括对 EAGAIN 信号的正确处理:编译大量错误输出所触发的问题:只读模式下不再创建缓存子目录:无法创建临时 stdout/stderr 文件时的错误报 ...
- ccache高速编译工具
ccache的主页:http://ccache.samba.org distcc的主页:http://distcc.samba.org 1.背景: 在处理一些规模相对较大的工程时,编译花费的时间可能会 ...
- kan-java, 一个能裁剪语法特性的java动态编译工具
'kan-java' 就是 '砍-java' 这是一个java代码动态编译工具,也就是能够把String形式的java代码实时地编译为字节码的工具: "动态编译"工具,其实自jdk ...
- 反编译工具jad简单用法
反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...
- CMake编译工具与项目构建
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Ma ...
- ILSpy可以反编译c语言,ILSpy反编译工具的使用
本文导读:ILSpy反编译工具的使用.不过,ILspy需要在电脑上安装.NET Framework 4.0.ILspy可以将一个dll文件转换为C#或VB语言.ILspy对于单个文件可以保存为.cs文 ...
- 一些Java反编译工具/源代码查看工具的介绍
2019独角兽企业重金招聘Python工程师标准>>> 有的朋友抱怨他们在使用他们公司的闭源框架时看不到底层的源代码.那么可以尝试使用一些Java反编译工具. 下面我举个例子介绍具体 ...
最新文章
- 平面广告设计和Web设计的差别
- Windows10~Tensorflow-GPU安装
- 获取收藏夹路径的C++代码
- mongotemplate 查list_mongoTemplate.aggregate()聚合查询 时间
- sklearn应用—高斯混合
- 存储安全与数据恢复基础手册-服务器篇
- Hibernate代码生成工具 设计全攻略
- cassandra随机获取数据,Cassandra适合写入和少读,HBASE随机读取写入
- SecureCRT护眼设置
- 【我想进大厂】Redis夺命连环11问
- java web不用框架_初学javaweb,远离各自框架
- python使用-python 类如何使用
- python3 协程 返回值_python asyncio 获取协程返回值和使用callback
- 将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方...
- [转]CxImage使用指南
- 湖南省长沙市谷歌高清卫星地图下载
- 围棋软件测试自学,围棋软件等级棋力水平测试(正版)
- 客户分段模型(Customer Segmentation Models)
- 远方的人 -- 龙瑜
- moment系列一:add() 方法和subtract() 方法的使用
热门文章
- python 的几个源生方法
- 如何将源生DrawerLayout满屏显示只覆盖ActionBar
- ubuntu14.04LTS下搜狗输入法问题汇总 (搜狗输入法崩溃,搜狗输入法候选区乱码,没有搜狗输入法皮肤)
- 微信小程序:大红喜庆版UI猜灯谜又叫猜字谜
- app.vue 跳转页面_APP被迫跳转3561次后,我确信互联网的尽头是购物APP
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter16-脚本控制
- Android程序crash处理
- 利用Pytorch搭建简单的图像分类模型(之二)---搭建网络
- codeup之沙漏图形
- SAM(segment anything model)分割一切 Demo测试及API调用