当前位置: 首页 > article >正文

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

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

默认已安装

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 : 开启实验功能;

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 = sublibQT_QPA_DEFAULT_PLATFORM=linuxfb   # 这里改成这样
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -ltsinclude(../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

相关文章:

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

Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上 1、环境介绍 QT版本:5.15.1 待移植环境: jetson nano 系列开发板 aarch64架构(arm64) 编译环境: 虚拟机Ubuntu18.04(x86_64) 2、…...

Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

starrocks批量启停脚本

#!/bin/bash # 定义 StarRocks 安装目录 STARROCKS_HOME"/path/to/starrocks" # 定义 FE 和 BE 节点列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…...

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…...

4.3 数组和集合的初始及赋值

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商…...

Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)

目前推出深度研究和深度检索的AI大模型有四家: OpenAI和Gemini 的deep research,以及Perplexity 和Grok的deep search,都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告,解决人力几小时甚至几天…...

关于sqlalchemy的ORM的使用

关于sqlalchemy的ORM的使用 二、创建表三、使用数据表、查询记录三、批量插入数据四、关于with...as...:的使用 二、创建表 使用Mapped来映射字段 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBa…...

【leetcode hot 100 148】排序序列

解法一:(双重循环)第一个循环head,逐步将head的node加入有序列表;第二个循环在有序列表中找到合适的位置,插入node。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …...

3-001:MySQL 中的回表是什么?

1. 什么是回表? 回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 需要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据&#xf…...

单片机设计暖脚器研究

标题:单片机设计暖脚器研究 内容:1.摘要 本文聚焦于基于单片机设计暖脚器的研究。背景方面,在寒冷季节,暖脚器能有效改善脚部寒冷状况,提升人们的舒适度,但传统暖脚器存在功能单一、温控不准确等问题。目的是设计一款智能、高效且…...

【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#

今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试,虚拟机都是一个非常实用的工具,它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版,深受广…...

AutoGen学习笔记系列(十三)Advanced - Logging

这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Logging 篇章,介绍了怎样在使用过程中添加日志信息,其实就是使用了python自带的日志库 logging。 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-g…...

scrcpy pc机远程 无线 控制android app 查看调试log

背景: 公司的安卓机,是那种大屏幕的连接usb外设的。不好挪动,占地方,不能直接连接pc机上的android stduio来调试。 所以从网上找了一个python adb.exe控制器,可以局域网内远程控制开发的app,并在android stduio上看…...

UE5.5 Niagara发射器更新属性

发射器属性 在 Niagara 里,Emitter 负责控制粒子生成的规则和行为。不同的 Emitter 属性决定了如何发射粒子、粒子如何模拟、计算方式等。 发射器 本地空间(Local Space) 控制粒子是否跟随发射器(Emitter)移动。 ✅…...

深度剖析Redis:双写一致性问题及解决方案全景解析

在高并发场景下,缓存与数据库的双写一致性是每个开发者必须直面的核心挑战。本文通过5大解决方案,带你彻底攻克这一技术难关! 一、问题全景图:当缓存遇到数据库 1.1 典型问题场景 // 典型问题代码示例 public void updateProduc…...

MongoDB备份与还原

备份恢复工具介绍 1)mongoexport/mongoimport 2)mongodump/mongorestore 备份工具区别 mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式 mongodump/mongorestore 导入/导出的是BSON格式。二进制方式,速度快 1)…...

计算机:基于深度学习的Web应用安全漏洞检测与扫描

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 网络爬虫 1.2 漏洞检测 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,…...

postgresql14编译安装脚本

#!/bin/bash####################################readme################################### #先上传postgresql源码包,再配置yum源,然后执行脚本 #备份官方yum源配置文件: #cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS…...

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候,一顿操作猛如虎,打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况,要去操作两边(宝塔and服务器所属平台…...

如何搭建一个适配微信小程序,h5,app的uni-app项目

在vscode搭建 uni-app 项目(Vue 3 Vite Pinia uView Plus) 一、环境准备 1. 安装 Node.js 确保已安装 Node.js(需≥14版本),可通过以下命令检查版本: node -v2. 安装 VSCode 从 VSCode 官网 下载并…...

【数据结构】List介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中,List是一个接口,继承自Collection。此时extends意为拓展 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示&…...

vs2022用git插件重置--删除更改(--hard)后恢复删除的内容

1、先到项目工程中打开需要恢复的分支。 2、进入代码管理根目录文件夹。 3、在根目录文件夹点右键,点git bash here 正常情况下如果git目录权限足够,是可以如上图所示显示当前分支和当前目录的。 在git权限不足的情况下会出现如下提示: …...

【C++】【数据结构】链表与线性表

线性表和链表优缺点及适用场景 线性表(以数组为例) 优点:随机访问效率高,可通过下标直接访问元素,时间复杂度为 O (1);存储密度大,内存连续存储,空间利用率高。缺点:插入…...

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆,邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible ; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…...

【MySQL】用户管理和权限

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】用户管理和权限 发布时间:2025.3.12 隶属专栏:MySQL 目录 引言用户用户信息创建用户语法案例 修改用户密码语法案例 删除用户语法案例 权限权限列表查看和刷新用户的权限给用户授权…...

3ds Max 快捷键分类指南(按功能划分)

以下整理了 3ds Max 常用快捷键,按核心功能模块分类,适用于 建模、动画、渲染 等全流程操作。 一、视图操作 快捷键功能Alt W最大化当前视图G隐藏/显示栅格F3线框/实体显示切换F4显示边面(实体线框)Z聚焦选中对象到视图中心Ctrl…...

npm、pnpm、cnpm、yarn、npx之间的区别

文章目录 区别特点pnpmyarncnpm 关键解读如何选择代码示例安装依赖运行命令 区别 特性npmyarnpnpmcnpmnpx核心定位Node.js 默认包管理增强稳定性与性能高效存储与严格隔离国内镜像加速工具临时执行包命令依赖存储方式扁平化 node_modules扁平化 lock 文件全局硬链接 符号链接…...

指令微调 (Instruction Tuning) 与 Prompt 工程

引言 预训练语言模型 (PLMs) 在通用语言能力方面展现出强大的潜力。然而,如何有效地引导 PLMs 遵循人类指令, 并输出符合人类意图的响应, 成为释放 PLMs 价值的关键挑战。 指令微调 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…...

Linux学习(十五)(故障排除(ICMP,Ping,Traceroute,网络统计,数据包分析))

故障排除是任何 Linux 用户或管理员的基本技能。这涉及识别和解决 Linux 系统中的问题。这些问题的范围包括常见的系统错误、硬件或软件问题、网络连接问题以及系统资源的管理。Linux 中的故障排除过程通常涉及使用命令行工具、检查系统和应用程序日志文件、了解系统进程&#…...