mcpField
B
build-acceleration

build-acceleration

github.com/mohitmishra786开发269518 次安装18 周前更新
代码仓库

关于 build-acceleration

面向 C/C++ 开发者和编程 Agent 的构建加速技能,指导先定位瓶颈,再选择缓存、分布式编译和编译配置方法。还介绍头文件裁剪与链接时间优化。

主要功能

  1. 01测量构建瓶颈
  2. 02配置 ccache 与 sccache
  3. 03使用预编译头
  4. 04启用 Unity 构建
  5. 05通过 split-DWARF 缩短链接时间
  6. 06使用 distcc 与 IWYU

适用场景

  1. 01减少重复编译耗时
  2. 02加速大型稳定头文件的编译
  3. 03分发编译任务到多台机器
  4. 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 内部原理

评论

支持 Markdown