ccache - 让Xcode编译速度飞起来
今天来介绍一个小工具ccache
,其可以提高xcode
的编译速度。说起缘由,是因为我的苹果电脑配置比较低,而每次开发调试或测试打包都需要编译工程,虽然项目工程代码量不算大,但是编译的时间还是很长,尤其是修改了头文件或者Archive
打包时,看着进度条像蜗牛在爬一样,心里都有小动物在奔腾......
好在遇到了ccache
,其原理是通过把项目的源文件用ccache
编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:C
、C++
、Objective-C
、Objective-C++
,但是如果找不到ccache
编译器,那么还是会选择clang
编译器来编译源文件。下面介绍一下具体的应用过程:
添加ccache脚本
下面是ccache
的编译脚本,命名为:ccache-clang
,需要添加到工程根目录,ccache
就是通过这个脚本来选择编译器的,该脚本的详细介绍如下:
第1行:指定这是一个bash
脚本
第2行:type -p ccache
判断是否存在ccache
命令,/dev/null
是空设备文件,2>&1
是把标准错误流重定向到标准输出流,所以整行的作用是先判断命令是否存在,如果不存在就把标准错误流重定向成标准输出流后,再重定向到空文件,这样错误就不会在控制台上打印出来了
第3行:设置最大的缓存
第4行:设置源文件的编译模式,默认是true
,ccache
会先处理源文件,如果缓存没有命中,就编译源文件;而如果是false
,就会在缓存没有命中时,不是直接编译源文件,而是编译处理后的文件,但是这可能会有问题,因为不同的编译器,预处理后的文件内容不完全相同
第5行:设置为true
,表明ccache
直接利用缓存目录下的文件,而不是拷贝后的文件,这样可以加快编译速度,默认是false
第6行:设置提高缓存命中率,忽略__FILE__、DATE、__TIME__等宏,也不检查文件的修改和创建时间是否是最新的等等
第9行:指定日志文件的路径
第10行:执行/usr/bin/clang
命令,"$@"
是指所有参数
第12行:执行系统默认的clang
命令,"$@"
是指所有参数
#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
# 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE='~/Desktop/CCache.log'
exec ccache /usr/bin/clang "$@"
else
exec clang "$@"
fi
如果你的代码或者三方库里的代码中有C++
文件,则需要把脚本命名为:ccache-clang++
,同时,脚本中的clang
也需要修改为clang++
,如下:
#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
# 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE='~/Desktop/CCache.log'
exec ccache /usr/bin/clang++ "$@"
else
exec clang++ "$@"
fi
配置Xcode项目
1.添加一个CC常量
在项目的Build Settings
里,添加一个常量:CC
,值为脚本的完整路径:$(SRCROOT)/ccache-clang
(脚本在根目录下)
添加CC
常量
因为ccache
不支持Clang Modules
,所以需要关闭项目的Modules
选项,如果你的工程里有用的@import UIKit
等,那么现在需要替换为#import <UIKit/UIKit>
,这是因为关闭Moduels
后,Xcode
不会再自动导入模块了,对于其他的模块,你还需要在Linked Frameworks and Libraries
里手动导入所需模块。
配置Pod项目
如果项目中用到了CocoaPods
,还需要设置Pod
工程,因为Pod
工程也需要关闭Modules
选项,我们可以按照修改Xcode
项目的方法来修改Pod
工程的modules
配置,但是每次pod update
会把Pod
工程重新生成,Modules
选项又被改回去了,所以我们直接在Podfile
里加入下面的代码,让Pod
工程在生成的时候就关闭Modules
选项,同时加入CC
常量,就可以在编译时用缓存加速了。
但是,由于我们关闭了modules
选项,如果某个Pod
工程用到了系统的框架,则需要按照Xcode
工程的方法添加到对应的Pod
工程里,否则会提示Undefined symbols xxx for architecture arm7
等等,尽管每次更新Pod
后,都需要重新添加所需的框架,但是考虑到编译速度的提升,而Pod
不会经常更新,所以也不是很麻烦。
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
#关闭 Enable Modules
config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'
# 在生成的 Pods 项目文件中加入 CC 参数,路径的值根据你自己的项目来修改
config.build_settings['CC'] = '$(PODS_ROOT)/ccache-clang'
end
end
end
应用ccache
设置完成后,就可以利用ccache
了,首次因为还没有缓存,要添加缓存,所以编译的时间会比没有用ccache
要多一会儿,但是从第二次之后,会有缓存命中,就可以加快编译速度了,多次之后,可以明显感觉到,编译的速度快了许多,一般至少了加快一倍以上,我们也可以用命令来查看ccache -s
的缓存的命中情况:
可以看到,现在的缓存命中率是53.01%
,以前打包需要10分钟,现在3分钟搞定,喝茶的时间又多了,是不是很开森,_。
通过添加ccache
,项目的编译速度得到了极大的提升,对于需要花费很长时间进行编译的项目,是十分值得的。
ccache — a fast C/C++ compiler cache
linux中shell变量$#,$@,$0,$1,$2的含义解释
ccache - 让Xcode编译速度飞起来的更多相关文章
- 加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案
最近在开发一个大项目的时候遇到一个很头疼的问题,由于项目代码较多,每次都要编译链接1分钟左右,调试的时候很浪费时间,于是研究了一下如何提高编译链接的速度,在这里分享给大家. 提升编译链接的速度主要有以 ...
- iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- XCode编译速度慢的解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- 快速提高 Xcode 编译速度的方法(转载自网上一个大神的方法)
1.,中的 Debug Information Format 的选项中选择 DWARF ,平时调试就是用整个选项,经过测试,速度确实有很大的提升,等发行版本的时候在调回 DWARF with dsYM ...
- 加快XCode编译链接速度(200%+)—XCode编译慢液
最近在一个大型项目的开发的时候遇到一个很头疼的问题,由于该项目的代码更,每次建立联系1纪要.浪费时间调试.因此,一些研究如何提高编译链接速度,这里给大家分享. 为了提高编译和链接的是以下三种方式的速度 ...
- 如何加快C++代码的编译速度 转 ccache
http://www.cnblogs.com/baiyanhuang/archive/2010/01/17/1730717.html C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速 ...
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...
- 怎样使用 CCache 进行 cocos2d-x 编译加速
https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/ccache-speed-up/zh.md C ...
- 微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结
1.引言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了. 记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶 ...
随机推荐
- mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程)
写在最前 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生M ...
- voa 2015 / 4 / 19
potentially – adv. capable of becoming real, a possibility tackle – v. to deal with a difficult pr ...
- jQuery手风琴的制作!!
jQuery手风琴的制作 首先我们先来做一个简单的jQuery的效果图 效果图 如下: css代码 如下: <style type="text/css" media=&quo ...
- Java基础语法<八> 继承
1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...
- 求n个逆元的O(n)算法
它的推导过程如下,设,那么 对上式两边同时除,进一步得到 再把和替换掉,最终得到 初始化,这样就可以通过递推法求出模奇素数的所有逆元了. 转自 http://blog.csdn.net/acdrea ...
- TP3.2写提交的验证码验证
把今天掌握的东西整理一下,要不然,我就忘干净了: 今天在做一个企业网站的时候,有一个在线留言的功能,最后提交的时候需要输入验证码.如图下: 当然,特连接的并不是我的后台 好了,开始了,首先我需要把验证 ...
- 记录Centos一些坑
首先说一下写这篇博客的初衷. 最近去客户现场出差,搭建一套服务端的自动构建环境. 准备支持的环境有CentOS 7.5.java8.Tomcat 8.maven3.3.9.TBA 2.1.9.4 等等 ...
- C++学习(七)入门篇——C++算数运算符
以下介绍5种C++基本运算符 +.-.×./.% 注意/为第一个数除以第二个数,结果为商的整数部分,小数部分被丢弃 %求模,两个操作数必须是整型,它生成第一个数除以第二个数的余数 如果其中一个是负数, ...
- iOS开发实战-时光记账Demo 本地数据库版
现在记账APP也是用途比较广泛 自己写了个简单的demo 欢迎指正 效果 分析 1.思维推导 首先简单的做了下思维推导 2.文件结构 大致框架想好后就可以着手开始准备了 数据库管理:coreData ...
- 【JS】cookies 的使用
摘要 cookies 的限制 IE6~IE6以下,每个域名最多20个cookie IE7及以上,每个域名最多50个cookie Firefox,每个域名最多50个cookie Opera,每个域名最多 ...