6. 交叉编译Qt库(Docker)

本章将简单介绍下如何使用Docker构建编译镜像,一键交叉编译Qt。

交叉编译可能有很多问题,我们仓库提供了一些已经交叉编译好的库, 具体库文件到 网盘 下载, 使用方式参考下教程 Qt程序编译

6.1. Docker简介

Docker 是一种开源的应用容器引擎,它可以让开发者将他们的应用及依赖包打包到一个可移植的镜像中, 然后发布到任何流行的Linux或Windows操作系统的机器上。Docker的容器采用沙箱机制,相互之间不会有任何接口,从而实现了更高的安全性。 Docker可以帮助开发者快速、高效地构建和部署应用,并且可以在不同的环境中运行,例如开发环境、测试环境和生产环境。

6.1.1. 安装Docker

Docker的安装,参考下 https://docs.docker.com/desktop/install/windows-install/

6.1.2. 配置Docker

构建基础的Qt模块,建议CPU核2个以上,内存4G以上,磁盘一般设置60G左右。 构建全部的Qt模块,CPU核越多越好,内存32G以上,磁盘一般设置100G左右。 如何配置配置参考下:

6.2. 构建编译镜像

提示

测试环境:Windows Docker Desktop,后端WSL2,为鲁班猫debian10系统交叉编译Qt5.15.8。

6.2.1. 拉取构建文件

打开Windows PowerShell,使用git命令获取构建文件,或者直接到 此处 下载:

git clone https://gitee.com/LubanCat/lubancat-cross-compile-qt

# 然后切换到debian10/Qt5目录
cd debian10/Qt5

6.2.2. 添加源文件

为鲁班猫debian10系统交叉编译Qt, 需要从 网盘 中获取相关源文件(文件在实时更新):

qt_cross_compiling25.png
# 从网盘获取下面文件,放到debain10/Qt5目录下
gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
qt-everywhere-opensource-src-5.15.8.tar.xz
sysroot_debian10.tar.gz

# 此时debian10/Qt5目录下文件:
.
├── build_qt5_base.sh
├── build_qt5_eglfs.sh
├── Dockerfile
├── Dockerfile.eglfs
├── sources.list
├── sysroot_debian10.tar.gz
├── qt-everywhere-opensource-src-5.15.8.tar.xz
└── gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

Qt源码和GCC交叉编译器源码到构建的镜像中,也可以编译Qt时从网络拉取。 需要修改构建文件中的Dockerfile文件:

# 添加交叉编译器,如果注释,后面编译脚本会从网络拉取(建议手动下载添加,自动下载很慢)
ADD gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz /opt

# 添加Qt5.15.8源码,如果注释,后面编译脚本会从网络拉取
ADD qt-everywhere-opensource-src-5.15.8.tar.xz /opt

6.2.3. 构建系统镜像

添加相应文件后,使用Dockerfile构建一个镜像building_qt:

docker build -t building_qt .

6.3. 运行容器自动交叉编译Qt

运行镜像前,创建一个挂载目录:

mkdir build

设置挂载目录,并运行容器:

docker run --mount src="$(pwd)/build",target=/build,type=bind  building_qt

容器运行后,将自动执行编译脚本build_qt5_base.sh,交叉编译完成后,Qt库将安装在build目录下,并打包成qt-everywhere-src-5.15.8.tar.gz文件。 接下来就可以在虚拟机Qt Creator中使用刚才编译出的Qt库, 具体配置参考下前面 Qt编译章节

6.4. 简单编译Qt程序

除了在虚拟机中使用上面编译出的qt库,也可以直接利用容器交叉编译Qt程序, 使用下面命令导出前面编译Qt的容器为一个新镜像:

docker commit {containerID] built

然后运行导出的镜像:

docker run --mount src="$(pwd)/build",target=/build,type=bind  -it  built  /bin/bash

进入终端命令行,可以使用/build/qt-everywhere-src-5.15.8/host/bin/qmake简单交叉编译下qt程序。