distcc是分布式c/c++编译系统,能显著加速c++编译。它将预处理后的编译任务分发至局域网多机并行执行,实测openssl编译从18分缩短至约6分钟;配合ccache后峰值加速达5.8倍,但依赖编译器版本、头文件路径等严格一致。

distcc 是什么,它真能加速 C++ 编译吗
distcc 本身不编译代码,只是把 g++ 或 clang++ 的编译任务(预处理后的 .ii 文件)分发到局域网其他机器上执行,再把目标文件(.o)拉回来。它对 C++ 有效,但前提是所有节点的编译器版本、头文件路径、宏定义、标准库(尤其是 libstdc++ 版本)完全一致——否则会链接失败或运行时崩溃。
典型提速场景:单台机器 CPU 核心少(如 4 核笔记本),局域网内有几台空闲的 8 核+ Linux 服务器;不适合跨平台(比如 macOS 客户端 + Linux 服务端)或 ABI 不兼容环境。
怎么配置 distcc 服务端(被调用的机器)
在每台待用的编译节点(如 build01、build02)上安装并启动 distccd:
- Ubuntu/Debian:
sudo apt install distcc;CentOS:sudo yum install distcc-server - 确保
g++在$PATH中且版本与客户端一致:g++ --version和ls -l $(which g++)都要核对 - 启动服务(监听局域网地址,非仅
localhost):sudo distccd --daemon --allow 192.168.1.0/24 --log-file /var/log/distccd.log --verbose - 防火墙放行默认端口
3632:sudo ufw allow 3632(Ubuntu)或sudo firewall-cmd --add-port=3632/tcp(CentOS)
注意:--allow 必须显式指定子网,0.0.0.0/0 不安全,127.0.0.1 会导致客户端连不上。
怎么让 C++ 项目实际走 distcc 编译
不能直接改 Makefile 里的 CXX = g++ —— distcc 要“伪装”成编译器,靠环境变量或 wrapper 控制行为:
- 设置环境变量(推荐):
export DISTCC_HOSTS="build01 build02,lzo"(lzo启用压缩,减少网络传输) - 把
distcc放到$PATH最前面:export PATH="/usr/lib/distcc:$PATH" - 在构建前重定向编译器:
export CXX="distcc g++"(CMake 项目需传入-DCMAKE_CXX_COMPILER=distcc) - 验证是否生效:
make -j8 CC="distcc gcc" CXX="distcc g++" V=1 2>&1 | grep -E "(distcc|compiling)",看到distcc: got response from build01才算成功
常见失效原因:忘记 export PATH、DISTCC_HOSTS 拼错主机名(DNS 不通)、服务端 distccd 进程没跑、g++ 版本不一致导致预处理阶段就报错。
为什么 C++ 模板或头文件改动后 distcc 加速不明显
distcc 只分发已预处理的源码(.ii)。如果头文件频繁变更(如 boost、自定义模板库),每次修改都会触发本地重新预处理,这部分无法并行,且预处理本身很耗 CPU。此时瓶颈从编译转移到了前端。
- 解决方案:用
c++ -E手动预处理 +distcc -c分离步骤(复杂,一般不值得) - 更实用做法:配合
ccache,先缓存预处理结果:export CC="ccache distcc gcc",export CXX="ccache distcc g++" - 注意:
ccache和distcc的哈希逻辑不同,务必用相同版本的ccache安装在所有节点,否则缓存命中率归零
真正省时间的是稳定的大中型 .cpp 文件;头文件爆炸的现代 C++ 项目,别指望 5 倍加速,20%~50% 是常态。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











