Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

汇创慧玩

  • 写在前面
  • 1. 查看系统架构相关指令
  • 2. ARM64交叉编译器环境搭建
  • 3. Qt编译arm64环境搭建
  • 4. 配置 Qt的本地aarch64交叉编译器
  • 5. 工程建立及编译验证

写在前面

苦辣酸甜时光八载,春夏秋冬志此一生
Qt简介:
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
在探索前期安装过程也是出现了星星点点的未知错误,摸黑探路,绕了许多弯路。
最近由于项目需要做国产系统适配,软件需要适配不同架构CPU!基于此特将经验寄予此文,望更多志同道合的朋友在这条探索的路上少走弯路,尽入主题!
环境:
PC系统:Ubutu20.04(x86_64架构) <本机>
Qt版本:Qt5.12.8(GCC 9.3.0,64bit) <本机>
Qt Creator 版本:4.11.0 <本机>
交叉编译器:gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <本机>
国产系统:Kylin Linux Advanced Server release V10(4.19.90-25.10.v2101.ky10.aarch64) 部署环境<即arm64架构>
GCC:v8.3.0 部署环境<即arm64架构>

1. 查看系统架构相关指令

Ubutu 本机

uname
uname -a
uname -i
uname -r
lsb_release -a
lsb_release -i
lsb_release -r

在这里插入图片描述
Kylin Linux 部署环境<即arm64架构>

uname
uname -a
uname -i
uname -r
nkvers

在这里插入图片描述查看CPU核数,它会显示逻辑核心数:

lscpu
nproc

2. ARM64交叉编译器环境搭建

1) 选定编译工具: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <可选其他版本>
2) 源码安装交叉编译工具:
源码安装指定版本是为适配所部署的环境v8.3.0 ,笔者安装了指定版本,大家没有特殊需求可参考 3)指令安装交叉编译工具
①下载:
注1: 从arm Developer 下载指定版本编译器;
在这里插入图片描述

注2: 这里还可以通过百度网盘下载v8.3.0
② 安装:
解压:

tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

重命名:

mv  gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu aarch64-linux-gnu-8.3.0 

将目标复制到指定目录下:<一般复制到 /opt 目录下,笔者复制到 ~/path/go 目录下>

sudo cp -rf aarch64-linux-gnu-8.3.0/ /opt 

or

mkdir -p ~/path/go
cp -rf aarch64-linux-gnu-8.3.0/ ~/path/go 

然后在环境变量里 /etc/profile <笔者在此文件添加>或 ~/.bashrc 添加全局变量 <注意添加自己正确路径,笔者前面未重命名>
$PATH:后面路径为gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin的解压路径

sudo vim /etc/profile

#borrieguo add arm aarch64
export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin

在这里插入图片描述

然后加载环境变量<添加在那个文件就source那个>

source /etc/profile

or

source ~/.bashrc

查看配置是否成功:输入aarch64 +TAB是否出现提示(有对应版本即表示配置成功):
在这里插入图片描述
查看安装路径:

which aarch64-linux-gnu-gcc-8.3.0

在这里插入图片描述

3) 指令安装交叉编译工具: 源码安装交叉编译工具和指令安装交叉编译工具选其中一个操作即可
指令安装自动适配本机合适版本,无需指定较为方便

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

安装后验证下是否ok,直接输aarch64- 加Tab键如果能自动补全aarch64-linux-gnu-gcc那就问题不大。
查看版本信息:

aarch64-linux-gnu-gcc -v

能查到如下图所示,说明安装完成。
在这里插入图片描述
查看安装路径:

which aarch64-linux-gnu-gcc

在这里插入图片描述

4) 编译源码测试:
为了进一步验证交叉编译器环境搭建是否搭建成功,可进行编译源码进行验证测试。(可省略)
笔者验证的是一个C++程序。main.cpp 内容如下:

#include <iostream>using namespace std;int main()
{cout << "Hello World!" << endl;return 0;
}

main.cpp 源码编译成arm64可执行文件,指令如下:

aarch64-linux-gnu-g++ -o main main.cpp

编译通过后通过file指令查看文件类型是否是ELF:64bit LSB shared object,ARM aarch64...。如果是,则完成源码编译。

file main

在这里插入图片描述
也可通过readelf -h指令查看文件系统架构是否是AArch64。如果是,则完成源码编译。

readelf -h main

在这里插入图片描述

3. Qt编译arm64环境搭建

1) 选定Qt版本: 5.12.8 <可选其他版本>
2) Qt源码下载:
因为后面要在开发板上跑Qt程序,所以必须下载Qt源码包,然后用交叉编译工具进行编译,才能得到在目标平台上可以运行的Qt SDK。笔者本机上的Qt版本为Qt5.12.8(GCC 9.3.0,64bit) ,故下载Qt5.12.8的源码,目的就是在本机上构建两个Qt环境(x86_64和arm64)。实现在本机的PC上配置ARM64的编译环境,在本机的PC上编译完成后,配置Qt交叉编译环境,然后再用Qt编译自己写的代码,最后copy部署到ARM平台上运行即可。
注1:Qt官网下载地址
在这里插入图片描述

注2:百度网盘下载v5.12.8

3) Qt源码安装:
①解压:
下载了qt-everywhere-src-5.12.8.tar.xz,然后通过xz命令解压出qt-everywhere-src-5.12.8.tar文件,再通过tar命令解压qt-everywhere-src-5.12.8.tar文件,得到文件夹:qt-everywhere-src-5.12.8。

xz -d qt-everywhere-src-5.12.8.tar.xz
tar -xvf qt-everywhere-src-5.12.8.tar

or

tar -xvf qt-everywhere-src-5.12.8.tar.xz

在这里插入图片描述
②定义SDK安装路径
强烈不建议在Qt源码的目录下直接进行编译,那样会污染源码所在目录。建议在Qt源码所在的同级目录下,新建一个文件夹用来存放编译过程中产生的临时文件。一定要注意源码路径不能含有中文!
创建编译过程路径:

mkdir Qt-5.12.8-build

创建最终安装路径:

mkdir Qt-5.12.8-arm64

③安装
安装准备1)
打开 qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf 配置文件,并修改为如下所示内容 ,因为一会我们要用到这个里面的内容,所以我们要先修改一下这里面的编译器。
根据自己的交叉编译器来进行编译修改,本机的交叉编译器为aarch64-linux-gnu-
如下所示:
在这里插入图片描述
注:上面的qmake.conf文件中,如果Ubuntu有好多个交叉编译器,一定要在交叉编译器前面加绝对路径,不然就会像我一开始make的时候会出现“not found”这些错误,或者出现下面这些错误

Makefile:51: recipe for target ‘sub-corelib-make_first’ failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase/src’
Makefile:46: recipe for target ‘sub-src-make_first’ failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase’
Makefile:77: recipe for target ‘module-qtbase-make_first’ failed
make: *** [module-qtbase-make_first] Error 2

安装准备2)
进入Qt-5.12.8-build文件夹执行configure

./../qt-everywhere-src-5.12.8/configure -prefix /home/airobot/path/qt/Qt-5.12.8-arm64 -make libs -xplatform linux-aarch64-gnu-g++  -skip qtdeclarative -no-opengl

说明:
-prefix 代表你的安装文件夹,即上面定义的最终安装路径,注意目录要对应;
-xplatform 代表你所制定的编译器;
-no-opengl -no表示不编译该模块;跳过编译openGL(因为我已经安装了Qt,所以不需要界面);
-skip qtdeclarative 跳过 qtdeclarative编译;
其它参数:
-opensource 编译开源版 -commercial 编译商业版 (参数可选);
-static 生成静态库.a文件 -shared 生成动态库so文件 (参数可选,默认是shared)注:静态库与动态库区别是在生成目标文件的链接方式上,静态库采用静态链接,在生成的目标文件(如执行文件)中会包含库文件代码,而动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
-force-debug-info 强制生成调试信息 (参数可选) 这个参数是让Qt release版本也生成.pdb文件。这个文件有什么作用呢?它就是我们在release版本下设置了异常捕获信息函数,打印出错堆栈信息所必须的文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。
-opengl dynamic 指定opengl库 (参数可选)
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。 OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
-skip 跳过该模块
-nomake 不编译该模块
-mp 启动多核编译
注:-skip和-nomake都可省略,但是-skip qtdeclarative这个参数不能省略,qtdeclarative模块有需要依赖的库,这里不跳过编译会失败。
如果有别的需求,可以./configure -help查看具体命令

在这里插入图片描述

也可使用“vim autoconfigure.sh”命令,新建“autoconfigure.sh”脚本,然后我们需要用 configure 生成下 Makefile,因为命令比较长,我们一般都是创建一个脚本,然后执行我们这个脚本生成 Makefile。
autoconfigure.sh 如下:

#!/bin/sh
#export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
./../qt-everywhere-src-5.12.8/configure -prefix ~/path/qt/Qt-5.12.8-arm64 \
#-static \
#-release \
-opensource \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
#-optimized-qmake \
#-pch \
#-qt-libjpeg \
#-qt-zlib \
-no-opengl \
#-skip qt3d \
#-skip qtcanvas3d \
#-skip qtpurchasing \
#-no-sse2 \
#-no-sse3 \
#-no-ssse3  \
#-no-sse4.1 \
#-no-sse4.2  \
#-no-avx \
#-no-avx2 \
#-no-mips_dsp \
#-no-mips_dspr2 \
#-qt-zlib \
#-no-openssl \
#-no-xcb 	\
#-no-cups \
#-no-iconv \
#-no-evdev  \
#-no-icu  \
#-no-fontconfig \
#-nomake examples \
#-nomake tools \
#-skip qtvirtualkeyboard \
#-qpa linuxfb	\
#-no-opengl \
#-no-libinput \
#-no-gstreamer \
#-no-system-proxies \
#-no-slog2  \
#-no-lgmon \
#-linuxfb \
#-v \
#-qt-libjpeg \
#-qt-libpng 	\
#-no-libproxy \
#-no-dbus	\
#-no-glib	\
#-no-compile-examples \
-skip qtdeclarative \

修改权限:

sudo chmod +x autoconfigure.sh 

执行脚本:

./autoconfigure.sh

在这里插入图片描述

提示选择版本,输入o,回车
在这里插入图片描述

询问是否接受协议,输入y,回车
在这里插入图片描述

安装准备3)
编译及安装

大概编译十来分钟

make -j4 2>&1 | tee build.log

在这里插入图片描述

make install

在这里插入图片描述

完成后进入~/path/qt/Qt-5.12.8-arm64/lib路径,可以查看文件属性。系统架构为AArch64

readelf -h libQt5DBus.so

系统架构为AArch64

这就是我们需要的东西,到时候拷贝到开发板在这里插入图片描述在这里插入图片描述

4. 配置 Qt的本地aarch64交叉编译器

1) 编译器(Compliers)配置:

在这里插入图片描述在这里插入图片描述
编译器(Compliers)安装完交叉编译工具,系统能自动找到。如果找不到需要自己通过添加(Add)按钮添加

which aarch64-linux-gnu-gcc
which aarch64-linux-gnu-g++

添加步骤:
C++编译器
在这里插入图片描述在这里插入图片描述
配置完成通过Apply按钮应用生效。
C编译器
在这里插入图片描述在这里插入图片描述
配置完成通过Apply按钮应用生效。

2) Qt版本(Qt Versions)配置:

Qt Versions需要添加一个自定义的版本,qmake需要刚编译安装后的qmake

在这里插入图片描述

配置完成通过Apply按钮应用生效。

3) 构建套件(Kit)配置:
Kit需要选择好自己新添加的Qt Version和编译器。
在这里插入图片描述
配置完成通过Apply按钮应用生效,通过OK按钮配置完成。

5. 工程建立及编译验证

新建工程,并选择上面配置的构建套件(Kit)
在这里插入图片描述

编译后得到可执行文件:

在这里插入图片描述
可执行文件为ARM aarch64架构,验证成功!

至此,恭喜您!Qt的交叉编译环境已成功安装,可以开始使用了!!!
下一个教程将讲述: Qt教程4-Ubuntu(x86_64)上用QEMU建立arm64(aarch64)的模拟开发环境,让您编译的ARM aarch64架构的程序在本机能够实现运行验证!
后续教程还将讲述: Qt教程5-Ubuntu(x86_64)上交叉编译的QT程序SSH直接部署到远程国产系统(ARM aarch64架构),让您在本机Qt开发的ARM aarch64架构程序,通过配置 Qt的SSH aarch64交叉编译器,从而共享所要部署的环境来直接在本机Qt上实现运行验证!

感谢阅读,我是汇创慧玩,希望文章能够解决您的问题。
事为之,须极致!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/621077.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper分布式应用程序协调服务+消息中间件kafka分布式数据处理平台

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

Redis实现延迟任务的几种方案

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.Redis如何实现延迟任务&#xff1f; 3.代码实现 3.1. 过期键通知事…

osg渲染过程

目录 1、渲染最简单代码 2、详解run方法 3、详细过程 4、回调函数 5、Node Visitor 1、渲染最简单代码 2、详解run方法 3、详细过程 3.1 advance()方法 进行帧计数 3.2 eventTraversal() eventTraversal()响应用户操作,eventTraversal()遍历的是事件队列&#xff0c;而…

力扣LeetCode138. 复制带随机指针的链表 两种解法(C语言实现)

目录 题目链接 题目分析 题目定位&#xff1a; 解题思路 解题思路1&#xff08;粗暴但是复杂度高&#xff09; 解题思路2&#xff08;巧妙并且复杂度低&#xff09; 题目链接 138. 复制带随机指针的链表https://leetcode-cn.com/problems/copy-list-with-random-pointer/ …

SpringBoot的旅游管理系统+论文+ppt+免费远程调试

项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql&#xff0c;使用SpringBoot框架开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 &#xff08;1&…

QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid

文章目录 场景描述问题排查根据提示查看原因查看封装的 message 个人简介 场景描述 QQ 邮箱使用 SMTP 发送邮件报错&#xff1a;550 The From header is missing or invalid&#xff1a; 失败原因&#xff1a;(550, bThe "From" header is missing or invalid. Ple…

AI大模型探索之路-应用篇12:AI大模型应用之向量数据库选型

目录 前言 一、什么是向量数据库&#xff1f; 二、向量数据库的应用场景 1. 图像检索 2. 推荐系统 3. 自然语言处理 三、向量数据库在AI大模型中的应用 1. 训练数据的索引和检索 2. 特征存储和管理 3. 模型中间结果的存储 4. 长上下文的记录和检索 5. 本地知识库的构…

9. Spring Boot 日志文件

本篇文章源码位置延续上个章节&#xff1a;SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/logging包下 1. 日志的作用 发现和定位问题&#xff1a; 日志是程序的重要组成部分&#xff0c;它在系统、程序出现错误或异常时提供诊断和解决问题的线…

【热门话题】PyTorch:深度学习领域的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PyTorch&#xff1a;深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…

Linux:zabbix配置网易邮箱告警(5)

1.开启邮箱的smtp服务 这里我使用网易邮箱&#xff0c;我需要先去开启邮箱的POP3/IMAP/SMTP/Exchange/CardDAV 服务 点击POP3/SMTP/IMAP 然后在这里开启两个服务 我这个已经去扫码添加过了&#xff0c;你点击新加授权码再去扫码发送信息&#xff0c;就可以得到一个授权密码 2.…

Vue2 基础学习-案例实践

数据管理信息的增删改查的实践 主要应用&#xff1a; 数据插值&#xff1a; {{xxx}}双向绑定&#xff1a;v-model点击事件函数&#xff1a;click列表xxx的增删改实现 xxx.push(row) 增加xxx.splice(id,1) 删除 一行{x,y} xxx[id]; 编辑 <!DOCTYPE html> <html la…

关于AG32 MCU的一些奇思妙想

1、AG32VF103的网口是100M还是10M&#xff1f; RE: 都是100M的。 2、用FPGA能不能再仿出一个网口&#xff1f;有些产品用到两个网口。 理论上可以&#xff0c;但是要考虑&#xff0c;一个是cpld实现难度&#xff0c;一个是需要的逻辑单元。因为mac逻辑多&#xff0c;内置的2KL…