Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上

news/2025/2/27 5:52:48

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

http://www.niftyadmin.cn/n/5869574.html

相关文章

--- spring MVC ---

引言 所谓MVC是一种软件的设计模型,他把软件系统分为三部分,View(视图),Controller(控制器),Model(模型),他们之间的关系是 spring mvc全称为spr…

深入解析 Spring 中的 BeanDefinition 和 BeanDefinitionRegistry

在 Spring 框架中,BeanDefinition 和 BeanDefinitionRegistry 是两个非常重要的概念,它们共同构成了 Spring IoC 容器的核心机制。本文将详细介绍这两个组件的作用、实现以及它们之间的关系。 一、BeanDefinition:Bean 的配置描述 1.1 什么…

线性回归(一)基于Scikit-Learn的简单线性回归

主要参考学习资料: 《机器学习算法的数学解析与Python实现》莫凡 著 前置知识:线性代数-Python 目录 问题背景数学模型假设函数损失函数优化方法训练步骤 代码实现 问题背景 回归问题是一类预测连续值的问题,满足这样要求的数学模型称作回归…

仿真环境下实现场景切换、定位物体和导航行走

1. 代码(以微波炉为例) from ai2thor.controller import Controller import math import randomdef distance_2d(pos1, pos2):"""计算两点之间的二维欧几里得距离(忽略Z轴)"""return math.sqrt((p…

Python在实际工作中的运用-通用格式CSV文件自动转换XLSX

继续上篇《Python在实际工作中的运用-CSV无损转XLSX的几个方法》我们对特定的CSV实现了快速转换XLSX的目标,但是运行Py脚本前还是需要编辑表格创建脚本和数据插入脚本,自动化程度很低,实用性不强,为提供工作效率,实现输…

kafka consumer 手动 ack

在消费 Kafka 消息时,手动确认(acknowledge)消息的消费,可以通过使用 KafkaConsumer 类中的 commitSync() 或 commitAsync() 方法来实现。这些方法将提交当前偏移量,确保在消费者崩溃时不会重新消费已处理的消息。 以…

HBase与MapReduce结合(二)——对HBase表中字段进行WordCount

目录 1. 数据文本2. pom.xml中依赖配置3. 工具类Util4. 导入数据ImportData5. 对HBase表进行WordCount6. 配置Job7. 结果参考 1. 数据文本 1_song1_2016-1-11 song1 singer1 man slow pc 2_song2_2016-1-11 song2 singer2 woman slow ios 3_song3_2016-1-11 song3 singer3 man…

Project #0 - C++ Primer前置知识学习

这次的Lab0主要以熟悉C 11和C 17的新特性。这里先把相关新特性分析一下。 目录 一、Doxygen注释 二、函数签名分析 三、构造函数与delete、explicit 四、static constexpr 解释 五、各种cast转换(重点) 5.1 const_cast与reinterpret_cast 5.2 static_cast与dynamic_cas…