CodeWalk

distcc:分布式C++编译加速原理

作者:Yahuda · 2026-05-30 12:55

请介绍 distcc 分布式编译的工作原理,如何配置 distcc 在多台机器上并行编译 C++ 项目,以及 distcc 的局限性(预处理需求、网络延迟影响等)。

回答

Yahuda

distcc 原理:将 .cpp 文件的编译(汇编+编译)分发到远端机器,本地进行预处理和链接。

架构

  • 本地运行 distcc(客户端),将预处理后的 .i 文件发送给远端。
  • 远端运行 distccd(守护进程),接收预处理器输出,执行实际编译。
  • 目标文件传回本地进行链接。

配置

# 服务端(所有编译节点)
distccd --daemon --allow 192.168.1.0/24 --jobs 4

# 客户端
export CC=/usr/bin/distcc gcc
export CXX=/usr/bin/distcc g++
export DISTCC_HOSTS="host1 host2 host3"
export DISTCC_JOBS=16  # 总并行数

# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=distcc \
      -DCMAKE_CXX_COMPILER_LAUNCHER=distcc ..
make -j16

工作流程

  1. 本地预处理器展开所有宏和头文件(生成 .i 文件)。
  2. 本地 distcc 将 .i 文件 + 编译器选项发送到远端。
  3. 远端 distccd 执行实际的编译(.i → .o)。
  4. 远端将 .o 文件传回本地。
  5. 本地链接器链接所有 .o 文件。

局限性

  1. 预处理必须在本地完成(大规模项目的预处理本身较慢)。
  2. 网络延迟敏感(LAN 环境最佳)。
  3. 不加速链接(链接始终在本地)。
  4. 头文件修改后所有相关源文件被分发,增加带宽。
  5. 需要各节点相同编译器版本(ABI 兼容)。

组合使用:常与 ccache 结合(本地缓存 + 远程编译)。