# C++加速编译工具ccache

当C++工程比较大的时候,编译时间将是一个不得不考虑的问题。有很多加快编译的方法,其中一种是使用缓存机制。ccache就是利用编译输出缓存加速编译的工具,当开发者试图构建相同的东西两次时,它将从读取缓存,而不是进行编译。

# ccache介绍

ccache是一个编译器缓存工具,它通过缓存之前的编译结果来加速重新编译的过程。当再次进行相同的编译时,ccache可以检测到并直接从缓存中获取结果,从而避免了重复的编译过程。

ccache的主要特性包括:

  • 支持GCC、Clang、MSVC(Microsoft Visual C++)等类似的编译器3。
  • 在Linux、macOS、其他类Unix操作系统以及Windows上工作。
  • 理解C、C++、汇编器、CUDA、Objective-C和Objective-C++。
  • 支持通过HTTP(例如使用Nginx或Google Cloud Storage)、Redis或NFS进行远程缓存,可选择地将数据分片到服务器集群。
  • 使用inode缓存来避免在构建过程中反复哈希相同的头文件(在支持的操作系统和文件系统上。
  • 支持使用Zstandard进行压缩。使用XXH3校验缓存内容以检测数据损坏。
  • 保持命中/未命中的统计信息。
  • 自动管理缓存大小。
  • 安装简单,可以从源码编译,也有编译好的二进制文件
  • 开销低
  • 支持将绝对路径重写为相对路径,以提高缓存命中率
  • 可选地在可能的地方使用文件克隆(也称为“reflinks”)来避免复制。在可能的地方使用硬链接来避免复制

值得注意的是,ccache只知道如何缓存单个文件的编译。对于其他类型的编译(如多文件编译、链接等),ccache会静默地回退到运行实际的编译器。

此外,一些编译器标志不受支持。如果检测到这样的标志,ccache也会静默地回退到运行实际的编译器。

# 安装及使用

ccache的主页为:https://ccache.dev/ (opens new window)

ccache对平台语言编译器的支持情况:https://ccache.dev/platform-compiler-language-support.html (opens new window)

安装包下载https://ccache.dev/download.html (opens new window)

下载安装包后解压文件

tar -xvf ccache-4.9.1-linux-x86_64.tar.xz

解压缩后的包中包含有使用手册,MANUAL.html

使用方式有两种,

  • 一种是临时用法,直接作为gcc/g++命令前缀:
ccache gcc test.c -o t
  • 另一种是全局用法:
cp ccache-4.9.1-linux-x86_64/ccache /usr/local/bin

sudo ln -s /usr/local/bin/ccache /usr/local/bin/gcc
sudo ln -s /usr/local/bin/ccache /usr/local/bin/g++

通过创建软链接后,将ccache化妆成了gcc/g++,‵cmake`等会自动调用。

ccache支持很多配置选项,可以在配置文件中进行配置:

# ~/.ccache/ccache.conf
max_size = 5.0G

ccache还会统计缓存命中等信息,

ccache -- show-stats
# Cacheable calls:   7946 / 7957 (99.86%)
#   Hits:            1541 / 7946 (19.39%)
#     Direct:           0 / 1541 ( 0.00%)
#     Preprocessed:  1541 / 1541 (100.0%)
#   Misses:          6405 / 7946 (80.61%)
# Uncacheable calls:   11 / 7957 ( 0.14%)
# Local storage:
#   Cache size (GB):  1.4 /  5.0 (27.75%)

以上就是使用ccache的介绍。