Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上
1、环境介绍
QT版本:5.15.1
待移植环境:
jetson nano 系列开发板
aarch64架构(arm64)
编译环境:
虚拟机Ubuntu18.04(x86_64)
2、简介
我们在Windows上完成Qt项目的开发后,一般来说需要将项目移到开发板中运行。但是开发板中没有安装或者安装QT的版本过低,所以需要我们进行重新安装。如果对Qt版本没有具体要求的话可以直接apt安装,看这个教程 apt install 直接安装Qt。有具体版本要求的话就需要去官网下载对应版本的源代码进行手动编译。
2、1 实现方法
编译方法我知道的有三种:
- 直接在开发板上进行编译
- 在虚拟机Ubuntu系统上进行交叉编译
- 在docker容器中进行编译
开发板上编译看这个博主:ARM开发板编译Qt
虚拟机Ubuntu交叉编译看这个博主:虚拟机交叉编译
我主要介绍在docker容器中进行编译。
3、准备工作
3.1、虚拟机安装Ubuntu(x86)
没有安装的网上教程很多
3.2、Ubuntu安装docekr
默认已安装
dockerarm64ubuntu_46">3.3、docker拉取arm64的ubuntu镜像
3.3.1、开启manifest
使用镜像创建一个容器,该镜像必须与 Docker 宿主机系统架构一致,例如x86_64 架构的系统中只能使用x86_64的镜像创建容器。docker manifest特性可支持用户在不同系统架构的机器上分别运行不同的架构的镜像。这一点基本不需要用户做任何适配,非常的方便。
1、编辑配置文件(没有就直接新建)
mkdir /root/.docker
cd /root/.docker
vim config.json
2、将以下内容添加进去
{
"auth": {},
"experimental": "enabled"
}
3.3.2、添加加速源
1、编辑文件(没有则新建)
vim /etc/docker/daemon.json
2、将以下内容添加
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
,"experimental": true
}
registry-mirrors : 添加阿里云加速源,也可以直接 [ ];
experimental : 开启实验功能;
docker_97">3.3.3、重新加载服务配置文件并重启docker
#重新加载服务的配置文件
systemctl daemon-reload
#重启docker
systemctl restart docker
3.3.4、拉取arm64的Ubuntu镜像
# 安装 qemu-user-static来确保x86_64的主机支持arm64的镜像
sudo apt-get update
sudo apt-get install qemu-user-static binfmt-support
sudo docker pull arm64v8/ubuntu:18.04
# 启动并进行文件映射,主机的文件中原来存放我们后面要下载的文件等
sudo docker run -it -v ~/host_data:/container_data arm64v8/ubuntu:18.04 bash
注意这个ubuntu系统是最精简的,你需要install各种你需要的包,以及编译Qt所需要的依赖
4、交叉编译Qt
4.1、下载源代码
Qt码源头下载地址
交叉编译器下载地址
4.2、安装交叉编译工具
将交叉编译工具压缩包gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar拷贝到虚拟机目录下
解压
tar -xvf xxxxx
然后交叉编译器添加到环境变量中
vim /etc/profile
#将下面的内容添加到最后一行
export PATH=SPATH: /usr/local/arm/gcc-linaro-6.3.1-2017.02-x86 64 aarch64-linux-gnu/bin/ # 这个路径改为自己的
保存并退出
source /etc/profile
4.3、修改qmake.conf文件
将下载的Qt源码移动到虚拟机中自己新建的文件夹中,我新建的Qt源码存放路径为/home/nvidia/ldy/qt-everywhere-src-5.15.1。不同的硬件架构对应不同的qmake.conf,在下载的Qt5.12.11源码中的qtbase/mkspecs/目录下有各种不同的平台,arm64对应的文件为linux-aarch64-gnu-g++目录下的qmake.conf文件。我们需要对这个文件进行修改编辑。
修改大概为这个样子(不要直接复制):
#
# qmake configuration for building with aarch64-linux-gnu-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM=linuxfb # 这里改成这样
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf 修改这4个路径,对应你自己的路径改
QMAKE_CC =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
# modifications to linux.conf 修改这4个路径,对应你自己的路径改
QMAKE_AR =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP =/usr/local/arm/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)
可以参考进行配置
4.4、配置Qt编译选项
我们先进入qt源代码的目录下,然后创建一个脚本文件用来进行configure。
sudo vim auto.sh
# 然后将下面的内容复制到里面(根据自己的需要对配置进行修改)
./configure -prefix /opt/qt5.15.1-new \ # 编译后Qt的安装目录,复制请删除注释
-opensource -confirm-license \
-release \
-strip \
-shared \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \ # 跳过一些不必要的库,复制请删除注释
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtwayland \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtpurchasing \
-skip qtsvg \
-skip qttranslations \
-skip qtwebengine \
-skip qtwinextras \
-skip qtxmlpatterns \
-make libs \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
-no-openssl \
--freetype=system \ # 这里我之前配置的=qt,结果后面运行时出现了字体的错误,复制请删除注释
--harfbuzz=qt \
-opengl desktop \ # 启用 OpenGL 支持,复制请删除注释
-xcb \ # 启用 xcb 支持
--xcb-xlib \ # 启用 xcb-xlib 支持,复制请删除注释
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-recheck-all
保存并退出,赋予最高权限
sudo chmod 777 auto.sh
4.5、开始编译
开始编译之前需要,安装一些必要的依赖,这里自行安装。
sudo ./auto.sh
sudo make -j8
sudo make install
时间可能有点长,耐心等待(1-2个小时,不同设备可能不同)
4.6、移植Qt到目标开发板
编译好了以后我们可以在这个目录/opt/qt5.15.1-new,看到编译好的Qt。
然后将这个编译好的Qt复制到目标开发板中,然后进行环境变量配置
sudo vim ~/.bashrc
# 然后将下面的内容填入(根据自己的路径进行修改)
# arm64 qt
# qt path config
export PATH=/opt/qt5.15.1-new/bin:$PATH
export LD_LIBRARY_PATH=/opt/qt5.15.1-new/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt5.15.1-new/plugins/platforms
export QT_QPA_FONTDIR=/opt/qt5.15.1-new/lib/fonts
#保存并退出
source ~/.bashrc
4.7、验证Qt是否安装成功
qmake -version
#输出:
QMake version 3.1
Using Qt version 5.15.1 in /opt/qt5.15.1-new/lib