Ubuntu20.04 Qt配置distcc(联合编译)

71 阅读1分钟

1. 安装distcc

        sudo apt update
        sudo apt install distcc
        sudo apt install ccache  可以不装
        sudo apt install distccmon-gnome 监控客户端,可以不装

3. 设置自启动

查看进程是否运行:

systemctl status distcc
或者
ps -ef|grep distccd

设置自启动:
方法1: 在中添加 vim /etc/rc.local添加如下命令:

sudo distccd --daemon --user nobody -a 0.0.0.0/[0]

方法2:编辑 /etc/default/distcc文件

将 `STARTDISTCC`改为 `true`\
将`LISTENER="127.0.0.1"`改为`LISTENER=""`或 `LISTENER="0.0.0.0"`
重启systemctl restart distcc

之后电脑重启后会通过/etc/init.d/distcc自动启动。

3. 设置哪些IP可以连接distcc

方法1:便捷文件/etc/profile文件

        # /usr/lib/distcc必须放在/usr/bin后面,否则回到导致找到/usr/lib/distcc里的gcc编译器,which gcc查看编译位置是否正确
        export PATH=$PATH:/usr/lib/distcc
        #(DISTCC_HOSTS中填写可以分配编译任务的主机的IP,有多少写多少,以空格分隔)
        export DISTCC_HOSTS="localhost x.x.x.x y.y.y.y"

重启电脑才能生效。

方法2 :编辑 /etc/default/distcc文件

    允许特定IP: ALLOWEDNETS="127.0.0.1 192.168.1.100"
    允许整个网段: ALLOWEDNETS="127.0.0.1 192.168.1.0/24"
    允许多个网段: ALLOWEDNETS="127.0.0.1 192.168.0.0/16 10.10.0.0/16"

重启systemctl restart distcc

4. 设置编译参数

以qt为例, 为pro添加编译参数(-j16 CXX=distcc CC=distcc)

Image.png

-j64为参与编译的核数

CXX="distcc gcc"设置c++编译参数distcc,如果是C则为CC="distcc g++"

# CC和CXX变量指定使用distcc来调用gcc和g++,注意:必须指定编译器
make -j16 CC="distcc gcc" CXX="distcc g++"

如果是交叉编译,则需要指定编译器: CC="distcc aarch64-none-linux-gnu-gcc" CXX="distcc aarch64-none-linux-gnu-g++"

5. 监控编译情况

你可以在编译过程中使用 distccmon-text工具来实时监控任务分发情况:

distccmon-text 2 # 数字2表示每2秒刷新一次

或者点击应用图标直接运行客户端

Image.png

​与 Ccache 结合使用​​:​​Ccache​​ 是一个编译器缓存,可以缓存之前的编译结果。​​Distcc​​ 负责分发任务,​​Ccache​​ 负责避免重复编译,两者结合能进一步提升效率。安装 ccache后,可以这样使用:

    export CCACHE_PREFIX="distcc" # 让ccache将编译任务前缀distcc 
    make -j16 CC="ccache gcc" CXX="ccache g++"

错误

distcc[68956] (main) CRITICAL! distcc seems to have invoked itself recursively! distcc[68945] ERROR: compile (null) on localhost failed with exit code 111

distcc在调用编译器时,没有找到真正的编译器程序,反而又找到了它自己,形成了一个无限循环.

原因是:1.将/usr/lib/distcc放在$PATH前面导致使用/usr/lib/distcc里的GCC编译器,2.make是没有指定编译器。

export PATH=/usr/lib/distcc:$PATH
make -j16 CC="distcc" CXX="distcc"

修复:

export PATH=$PATH:/usr/lib/distcc
make -j16 CC="distcc gcc" CXX="distcc g++"