关于 build-acceleration
面向 C/C++ 开发者和编程 Agent 的构建加速技能,指导先定位瓶颈,再选择缓存、分布式编译和编译配置方法。还介绍头文件裁剪与链接时间优化。
主要功能
- 01测量构建瓶颈
- 02配置 ccache 与 sccache
- 03使用预编译头
- 04启用 Unity 构建
- 05通过 split-DWARF 缩短链接时间
- 06使用 distcc 与 IWYU
适用场景
- 01减少重复编译耗时
- 02加速大型稳定头文件的编译
- 03分发编译任务到多台机器
- 04降低调试信息带来的链接开销
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill build-acceleration安装后在 Claude Code 中输入/build-acceleration确认已加载。
附带文件references/ccache-config.md
详细介绍
构建加速
目的
指导 Agent 通过缓存(ccache/sccache)、分布式编译(distcc)、Unity/Jumbo 构建、预编译头、使用 split-DWARF 加快链接,以及使用 IWYU 精简 include,缩短 C/C++ 构建时间。
触发条件
- “我的 C++ 构建太慢了——如何加快速度?”
- “如何设置 ccache / sccache?”
- “预编译头如何与 CMake 配合使用?”
- “如何设置使用 distcc 进行分布式编译?”
- “如何使用 split-DWARF 缩短链接时间?”
- “如何找出哪些头文件拖慢了编译?”
工作流
1. 先诊断瓶颈
# Time the full build
time cmake --build build -j$(nproc)
# Find the slowest TUs (CMake ≥3.16 with --profiling-output)
cmake -S . -B build -DCMAKE_CXX_FLAGS="-ftime-report"
cmake --build build 2>&1 | grep "Total" | sort -t: -k2 -rn | head -20
# Ninja build timings (use ninja -j1 for serial timing)
ninja -C build -j1 2>&1 | grep "^\[" | sort -t" " -k2 -rn | head -20
2. ccache——编译器缓存
# Install
apt-get install ccache # Ubuntu/Debian
brew install ccache # macOS
# Check hit rate
ccache -s
# Configure cache size (default 5GB)
ccache -M 20G
# Invalidate cache if needed
ccache -C
CMake 集成(推荐优于前缀技巧):
# CMakeLists.txt
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
endif()
~/.config/ccache/ccache.conf 的关键选项:
max_size = 20G
compression = true
compression_level = 6
# For CI: share cache across jobs
cache_dir = /shared/ccache
3. sccache——兼容云端的缓存(Rust、C/C++)
cargo install sccache
# Or: brew install sccache
# Set as compiler launcher
export RUSTC_WRAPPER=sccache # for Rust
export CMAKE_C_COMPILER_LAUNCHER=sccache # for CMake
# With S3 backend
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
sccache --start-server
sccache --show-stats
4. 预编译头(PCH)
PCH 会编译一次大型头文件,并重复使用其二进制形式。
# CMake ≥3.16 native PCH support
target_precompile_headers(mylib PRIVATE
<vector>
<string>
<unordered_map>
"myproject/common.h"
)
# Share PCH across targets (avoids recompilation)
target_precompile_headers(myapp REUSE_FROM mylib)
// Traditional: stdafx.h / pch.h approach
// All TUs include pch.h as the very first include
// pch.h includes heavy system headers
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
当头文件较大且稳定时(STL、Boost、Qt),PCH 效果最佳。避免对频繁更改的项目头文件使用 PCH。
5. Unity / Jumbo 构建
将多个 .cpp 文件合并为一个 TU,以减少解析头文件的开销并改善内联。
# CMake ≥3.16 unity build
set_target_properties(mylib PROPERTIES UNITY_BUILD ON)
# Control batch size (default 8 files per unity TU)
set_target_properties(mylib PROPERTIES UNITY_BUILD_BATCH_SIZE 16)
# Exclude specific files from unity (e.g., if they have ODR issues)
set_source_files_properties(problem.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
手动编写 Unity 文件:
// unity_build.cpp
#include "module_a.cpp"
#include "module_b.cpp"
#include "module_c.cpp"
注意:匿名命名空间(每个 TU 都有自己的匿名命名空间)、头文件中的 using namespace、重复的静态变量。
6. split-DWARF——缩短链接时间
split-DWARF 会将调试信息放入 .dwo 旁文件,大幅减少链接器需要处理的内容。
# GCC / Clang
gcc -g -gsplit-dwarf -o prog main.c
# CMake global
add_compile_options(-gsplit-dwarf)
# Combine .dwo files for distribution (optional)
dwp -o prog.dwp prog # GNU dwp tool
配合 --gdb-index,加快 GDB 启动速度:
gcc -g -gsplit-dwarf -Wl,--gdb-index -o prog main.c
链接时间对比(大型项目,典型情况):完整 DWARF 的 -g 比 -gsplit-dwarf 链接时间长约 4×–6×。
7. distcc——分布式编译
# Install on all machines
apt-get install distcc
# Start daemon on worker machines
distccd --daemon --allow 192.168.1.0/24 --jobs 8
# Client: set DISTCC_HOSTS
export DISTCC_HOSTS="localhost/4 worker1/8 worker2/8"
make -j20 CC="distcc gcc"
# CMake integration
set(CMAKE_C_COMPILER_LAUNCHER distcc)
set(CMAKE_CXX_COMPILER_LAUNCHER distcc)
与 ccache 配合使用:CC="ccache distcc gcc"——ccache 会先检查本地缓存,未命中时再回退到 distcc。
8. 使用 IWYU 精简 include
# Install
apt-get install iwyu
# Run via CMake
cmake -S . -B build -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=iwyu
cmake --build build 2>&1 | tee iwyu.log
# Apply fixes automatically
fix_include < iwyu.log --nosafe_headers
完整的 IWYU 工作流请参阅 skills/build-systems/include-what-you-use。
ccache 配置选项请参阅 references/ccache-config.md。
相关技能
- 使用
skills/build-systems/cmake了解 CMake 项目结构 - 使用
skills/build-systems/include-what-you-use精简 IWYU 头文件 - 使用
skills/rust/rust-build-times了解 Rust 专属的构建加速方法 - 使用
skills/debuggers/dwarf-debug-format了解 split-DWARF 内部原理