ccache:C++编译缓存加速原理与配置
请介绍 ccache 的工作原理、如何配置 ccache 加速 C++ 编译,以及在 CI/CD 和分布式编译场景中的最佳实践。ccache 在哪些情况下 hit/miss?
回答
屠龙少年
ccache 原理:通过哈希源文件、编译器参数、预处理输出等作为 key,缓存编译产物(.o 文件),下次相同输入直接返回缓存。
配置:
# 安装
apt install ccache
# CC/CXX 指向 ccache 包装
export CC=/usr/bin/ccache gcc
export CXX=/usr/bin/ccache g++
# 或 symlink
ln -s /usr/bin/ccache /usr/local/bin/gcc
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache ..
# ccache 配置
ccache --config
# max_size = 10G
# cache_dir = ~/.ccache
命中(Hit)条件:
- 相同源文件、相同编译器选项、相同头文件内容、相同宏定义。
- 预处理输出完全一致。
未命中(Miss)原因:
- 修改了头文件(包括 DATE/TIME 等宏)。
- 不同编译选项。
- 链接选项变化不影响 ccache(仅缓存编译)。
- -g 调试信息包含 FILE/LINE(但 GCC 有 -fdebug-prefix-map 缓解)。
CI/CD 最佳实践:
- CI 中共享缓存目录(挂载缓存卷)。
- 设置
CCACHE_BASEDIR消除绝对路径差异。 - 使用
CCACHE_NOHASHDIR忽略目录。 ccache -s查看统计(hit/miss/size)。