超大型项目(如android系统)在普通电脑上的编译往往都需要好几个小时的时间,非常影响开发调试等工作。令人欣慰的是,使用ccache编译缓存机制可以一定程度的减少编译时间。
*这里建议用github上的ccache项目,下载好源码之后在本地编译出安装包,然后安装到ubuntu系统。
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), 完成.
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
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
试验对象:高通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