distcc普通模式更稳定,因预处理快且局域网传输无压力;泵模式要求所有节点头文件路径和宏定义完全一致,否则易报错。

distcc 能让多台机器并行编译 C++,但配置不对反而更慢,甚至编译失败。关键不是“加机器”,而是让预处理、编译、路径、权限这四件事对齐。
distcc 普通模式 vs 泵模式怎么选
普通模式(默认)由本地做预处理(gcc -E),只把预处理后的 .i 文件发给远端编译;泵模式(-- pump)连预处理也发过去。实际中:
- 预处理本身很快,且
.i文件虽大但局域网传输无压力,普通模式更稳定 - 泵模式要求所有节点有完全一致的头文件路径和宏定义,稍有差异就报
fatal error: xxx.h: No such file or directory - 除非你明确控制所有机器的
include路径(比如统一挂载 NFS),否则别开泵模式
/etc/distcc/hosts 配置顺序和权重细节
客户端靠这个文件决定往哪发任务,顺序和后缀直接影响负载均衡效果:
-
localhost/16表示本机最多用 16 个distccd进程 —— 实际上就是make -j16的本地并发上限 -
10.68.12.50/16表示该远端最多接受 16 个并发编译任务,不是“最多用它 16 次” -
--randomize必须放在最前面,否则distcc会按顺序轮询,导致第一台机器永远最忙 - 不要写域名(如
build01.local),DNS 解析失败会导致整个编译卡住,一律用 IP
distcc-server 启动失败的三个常见原因
装完 distcc-server-3.0-1.x86_64.rpm 后 systemctl start distccd 报错,大概率是以下之一:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
-
/etc/distcc/clients.allow不存在或权限不对(必须644,且属主为root) - 防火墙没开端口:
distccd默认监听3632/tcp,要确认firewall-cmd --permanent --add-port=3632/tcp并重载 - SELinux 拦截:临时关掉验证是否是它(
setenforce 0),若是则需加策略:semanage port -a -t distcc_port_t -p tcp 3632
CMake 或 Make 如何真正用上 distcc
光装好服务没用,构建系统必须把编译器换成 distcc 包装过的命令:
- 不要改环境变量
CC/CXX为distcc—— 它不识别-c以外的参数,链接阶段会崩 - 正确做法是创建符号链接:
ln -s /usr/bin/distcc /usr/lib/distcc/bin/g++,再把/usr/lib/distcc/bin加到$PATH最前面 - CMake 中显式指定:
cmake -DCMAKE_CXX_COMPILER=/usr/lib/distcc/bin/g++ .. - 验证是否生效:编译时加
make -j8 V=1,看到命令行里出现distcc g++ ... -c xxx.cpp才算成功
最容易被忽略的是头文件一致性 —— distcc 不同步头文件,远端机器缺一个 boost/system/error_code.hpp,错误就出现在你本地终端的最后一行,但根本看不出是哪台远端炸的。上线前务必在每台 server 上跑一遍 g++ -E test.cpp -o /dev/null 验证基础头文件可达性。

















