当前位置: 首页 > 工具软件 > ccache > 使用案例 >

Linux系列讲解 —— 使用ccache提高编译速度

空英逸
2023-12-01

超大型项目(如android系统)在普通电脑上的编译往往都需要好几个小时的时间,非常影响开发调试等工作。令人欣慰的是,使用ccache编译缓存机制可以一定程度的减少编译时间。

*这里建议用github上的ccache项目,下载好源码之后在本地编译出安装包,然后安装到ubuntu系统。

1. 下载ccache源码

sun@sun-pc:~/myproject$ git clone https://github.com/ccache/ccache.git
正克隆到 'ccache'...
remote: Enumerating objects: 23568, done.
remote: Counting objects: 100% (2505/2505), done.
remote: Compressing objects: 100% (359/359), done.
remote: Total 23568 (delta 2268), reused 2254 (delta 2145), pack-reused 21063
接收对象中: 100% (23568/23568), 10.49 MiB | 157.00 KiB/s, 完成.
处理 delta 中: 100% (17362/17362), 完成.

2. 编译并安装ccache

sun@sun-pc:~/myproject$ cd ccache
sun@sun-pc:~/myproject/ccache$ mkdir build && cd build

#用cmake构建工程编译文件,如果没有用apt安装就行,构建成功后此文件夹会出现Makefile等文件
sun@sun-pc:~/myproject/ccache/build$ cmake -DCMAKE_BUILD_TYPE=Release ..

#编译ccache
sun@sun-pc:~/myproject/ccache/build$ make

#安装ccache,默认安装位置/usr/local/bin/
sun@sun-pc:~/myproject/ccache/build$ sudo make install

问题及解决方案:
(1) 执行cmake出现下面问题,提示CMake版本过低

sun@sun-pc:~/myproject/ccache/build$ cmake -DCMAKE_BUILD_TYPE=Release ..
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  CMake 3.15 or higher is required.  You are running version 3.10.2


-- Configuring incomplete, errors occurred!

解决方法:apt源的软件版本一般较低,可以安装snap上的新版CMake

#使用snap安装cmake
sun@sun-pc:~/myproject/ccache/build$ sudo snap install cmake --classic

#如果没有配置snap的PATH,需要配置一下
sun@sun-pc:~/myproject/ccache/build$ PATH=$PATH:/snap/bin

#查看安装的cmake版本,可以看到这个版本是大于3.15的,符合要求
sun@sun-pc:~/3rdcode/ccache/build$ cmake --version
cmake version 3.24.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

(2) 如果make的过程中,出现下面问题,那是因为c++版本不对,filesystem是c++17的库,安装c++17请参考Linux系列讲解 —— Ubuntu18.04安装gcc 9.1.0(C++17)

sun@sun-pc:~/myproject/ccache/build$ make
...
In file included from /home/sun/myproject/ccache/src/Args.cpp:21:0:
/home/sun/myproject/ccache/src/Util.hpp:25:10: fatal error: filesystem: 没有那个文件或目录
 #include <filesystem>
          ^~~~~~~~~~~~
compilation terminated.
src/CMakeFiles/ccache_framework.dir/build.make:75: recipe for target 'src/CMakeFiles/ccache_framework.dir/Args.cpp.o' failed
make[2]: *** [src/CMakeFiles/ccache_framework.dir/Args.cpp.o] Error 1
CMakeFiles/Makefile2:844: recipe for target 'src/CMakeFiles/ccache_framework.dir/all' failed
make[1]: *** [src/CMakeFiles/ccache_framework.dir/all] Error 2
Makefile:165: recipe for target 'all' failed
make: *** [all] Error 2

3. 配置环境变量

export USE_CCACHE=1                        #是否开启ccache,如果不用请设置为0
export CCACHE_COMPRESS=1                   #编译缓存是否压缩,压缩节省空间但性能略低。【 1:压缩 】【 0:不压缩 】
export CCACHE_EXEC=/usr/local/bin/ccache   #ccache的执行程序路径
export CCACHE_DIR=                         #这个是缓存文件路径,默认是 ~/.ccache目录
${CCACHE_EXEC} -M 50G                      #设置缓存目录大小,根据具体情况而定

问题及解决方案:
如果在执行${CCACHE_EXEC} -M 50G的时候,发生类似下面的错误,原因是libstdc++.so.6里边没有GLIBCXX_3.4.26符号,而libstdc++.so.6是个软链接,指向某个版本的libstdc++.so.6.x.x,所以说只要将包含GLIBCXX_3.4.26符号的libstdc++.so库拷贝到lib64目录,并将libstdc++.so.6重新链接这个新库即可。

/usr/local/bin/ccache: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /usr/local/bin/ccache)

gcc 9.1.0源码包中有包含GLIBCXX_3.4.26的libstdc++库,如果想安装gcc 9.1.0请参考Linux系列讲解 —— Ubuntu18.04安装gcc 9.1.0(C++17)
可以使用strings命令查看库中的符号,进而找到符合要求的libc++库文件。可以参考下面的命令:

find -name "libstdc++.so.*"
strings ./build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.26 | grep GLIBCXX_3.4.26

4. 验证ccache的编译速度提升

试验对象:高通QCM6125平台的Android10代码
电脑配置:I7-10700(8核16线程),32G RAM,SN550 1T固态硬盘

每一次编译前都会删除out目录,数据如下:

#第一次编译的时间感觉有点怪,可能是我out目录忘了清理。第一次编译要从头开始缓存编译文件,正常要慢一些的。
共耗时: 128min 33s   第一次编译 -j8   USE_CCACHE=true  
共耗时: 93min 2s     第二次编译 -j8   USE_CCACHE=true
共耗时: 88min 32s    第三次编译 -j16  USE_CCACHE=true
共耗时: 204min 31s   第四次编译 -j16  USE_CCACHE=false
共耗时: 241min 28s   第五次编译 -j8   USE_CCACHE=false
共耗时: 91min 34s    第六次编译 -j8   USE_CCACHE=true
 类似资料: