信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建

    • 前言
    • 交叉工具链
      • Ubuntu上安装 32 位 ARM 交叉工具链
      • Ubuntu上安装 64 位 ARM 交叉工具链
    • 交叉编译 QT 库
      • 下载 QT 源码
      • 交叉编译 QT 源码
    • Qt Creator交叉编译配置
      • 配置 Qt Creator Kits
      • 创建一个测试项目
    • 小结

前言

有没有碰到过这种情况?开发出一款软件产品,交付给客户,客户说安装不上。经过一番调查,原因让人哭笑不得,你以兆芯为目标进行开发,客户电脑却用的是华为鲲鹏。这也不能怪客户,经过多年的市场培育,在大多数人的认知里,电脑就是 Windows 系统加上英特尔处理器。

这些年国产信创 Linux 系统开始推广,才有少数人开始有了操作系统的概念,原来除了 Windows 系统之外,还有其他奇奇怪怪的系统。

不光是操作系统, CPU 也是有好多种,并不是只有英特尔兼容的 CPU 才叫 CPU。由于 Intel CPU 的封闭性,越来越多的国内厂商瞄准了 ARM。ARM 芯片虽然主要使用在手机、嵌入式系统上,但经过厂商多年的努力,ARM 芯片的性能不断提升。特别是苹果公司宣布苹果电脑全线产品改用自家的 ARM 芯片,给了市场一剂强心剂。搭载苹果 M1、M2 等芯片的 Mac 系列电脑上市后,的确带来了惊喜。换芯后的 Mac 电脑不仅性能强大,功耗还相当低。

苹果公司把路都探好了,国内厂商没有理由不跟进,纷纷推出了针对桌面系统的 ARM 芯片,比如华为鲲鹏 990。目前,搭载华为鲲鹏 990 芯片的笔记本、台式机已经上市,操作系统一般搭载麒麟或统信 UOS 操作系统。

操作系统和 CPU 打头阵,应用程序得跟上才行。如果是使用 Java、Python 等解释性语言开发的应用,只要解释器或者虚拟机进行了移植,应用程序无需修改,可以直接在新的 CPU 架构上运行。但是对于 C/C++ 等编译语言开发的应用程序,则需要重新编译,有的甚至需要重新开发。

QT 作为一种广为流行的跨平台软件开发框架,在桌面应用开发中得到广泛应用。如何将为 X86 架构开发的 QT 应用,移植到 ARM 架构的系统上,是开发人员所要面临的新课题。

本文将介绍如何将 QT 应用程序移植到 ARM 架构的 Linux 系统上,方法同样适用于 ARM 版麒麟系统和 统信 UOS 系统。

交叉工具链

开发针对 ARM 架构的 QT 应用,有两种开发模式。

第一种就是以目标机作为开发环境,比如 ARM 版麒麟系统,在上面安装编译器、IDE 工具,编写代码,并最终编译、打包。不管是 ARM 版麒麟系统还是 ARM 版统信 UOS 系统,都有完整的 GCC 工具链,编译代码没有问题,但诸如 Qt Creator 之类的 IDE 工具就不见得有。另外 ARM 版的 Linux 系统,软件不够丰富,很多软件还没有提供 ARM 版本,碰到问题也不好解决。

所以,推荐采用第二种方式,即在英特尔 CPU 的Ubuntu 系统上开发、编译、打包,最后发布到 ARM 架构的系统上。这种方式就涉及到交叉编译。

所谓交叉编译(Cross-Compilation),是指在一种计算机系统上生成可在另一种不同体系结构或操作系统上运行的代码的过程。通常情况下,交叉编译涉及将源代码从一种平台(通常是开发者的本地平台)编译成目标平台上的可执行文件或库。这种技术在嵌入式系统、移动设备、服务器和其他各种计算机领域中都非常常见。

交叉编译的第一步就是需要交叉编译器(或叫交叉编译工具链),这是一种特殊的编译器,能够在一种平台上生成另一种平台的代码。

我们需要知道,ARM CPU 也是有 32 位和 64 位之分。早期的 ARM CPU,比如广泛使用的 ARMv7 指令集,就是 32 位。ARMv8-A 架构是 ARM 的第一个支持 64 位指令集的架构,它引入了 64 位的通用寄存器和指令集,同时也保留了对 32 位指令集的兼容性。

如果你希望你的应用程序具有更好的兼容性,可以选择针对 ARM 32 位处理器的交叉编译工具链。如果你希望更好的性能,只针对 64 位 ARM 处理器开发,那优选 ARM 32 位处理器的交叉编译工具链。

Ubuntu上安装 32 位 ARM 交叉工具链

在Ubuntu 上安装 ARM 交叉工具链,推荐直接使用 apt 包管理器。

首先,打开终端并更新软件包列表:

sudo apt update

然后安装 ARM 架构的交叉编译器工具链:

sudo apt install gcc-arm-linux-gnueabi

这将安装 GNU 工具链,其中包括了用于 ARM 架构的交叉编译器。

安装完毕后,你可以在终端中输入 arm-linux-gnueabi-gcc -v 命令验证:

$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/9/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-specs='%{mfloat-abi=hard:-march=armv7-a -mcpu=generic-armv7-a -mfloat-abi=hard}' --with-arch=armv5t --with-float=soft --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)

某些 CPU 厂家可能提供了针对自家 CPU 优化的 GCC 交叉工具链,请参考提供的文档进行安装和配置。

Ubuntu上安装 64 位 ARM 交叉工具链

步骤和 32 位交叉工具链的安装类似。两种交叉工具链是可以同时安装的。ARM 64 位架构也被称为 AArch64。

  1. 打开终端并更新软件包列表:
sudo apt update
  1. 安装 ARM 64 位架构的交叉编译器工具链:
sudo apt install gcc-aarch64-linux-gnu
  1. 验证安装
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) 

交叉编译 QT 库

QT 应用程序的开发离不开 QT 库。虽然麒麟系统和统信 UOS 系统都带有 QT 库(ARM 版带的是 ARM 架构的 QT 库),直接使用麒麟系统或统信 UOS 系统的 QT 库最简单。但有几种情况可能会需要你编译自己的 QT 库。

  1. 麒麟系统和统信 UOS 系统带的 QT 库版本不同,你希望应用程序能同时运行在多种系统上,而不是每个系统开发一个版本。
  2. 你已经为其它平台,如 Window、Mac OS 开发了 QT 应用程序,当时已经选择了 QT 的某个版本。为了代码跨平台,你希望选择同一版本的 QT。
  3. 你希望使用较新版本的 QT,而麒麟系统或统信 UOS 系统的 QT 库相对较老。

下载 QT 源码

QT 系统庞大而且复杂,除了 QT 框架,还有 QT Creator、QT Designer 之类的开发工具,所以要看准 QT 库,不要下错了。QT 库的链接:

https://download.qt.io/archive/qt/

选择你要使用的 QT 版本。在本专栏中,我都是使用 5.15.2 这个版本,这是一个 LTS(长期支持) 版本,也是最后一个支持 Windows 7 的版本。

先点击 5.15 这个链接,接下来点击 5.15.2 这个链接,再点击 single 链接,进入源码下载:
在这里插入图片描述
根据喜好选择 zip 包或者 tar 包,下载其中一个即可。

这里以 qt-everywhere-src-5.15.2.tar.xz 为例。

交叉编译 QT 源码

  1. 解压 QT 源码
tar xvf qt-everywhere-src-5.15.2.tar.xz

可以看到 qt-everywhere 源码中包含了几乎所有的 QT 模块。
在这里插入图片描述
2. 配置编译选项

配置编译选项有很多,可以使用如下的命令查看编译选项:

$ ./configure -h

因为选项很多,这里不一一解释,只说明一下我要修改的选项,其它的使用默认值。

-prefix <dir> 编译后的库文件安装路径前缀,一般是 /usr/local/Qt-$QT_VERSION,我不希望将 ARM版 QT 安装到系统目录,避免和 x86 版的 QT 混淆,所以指定别的路径。
-xplatform <target> 选择交叉工具链,这里使用 linux-arm-gnueabi-g++
-opensource 构建开源版 QT
-confirm-license 自动确认许可证
-no-opengl 禁用 OpenGL 支持
-skip <module> 如果某个模块不需要或编译不过,可以先不编译

最终的配置命令为:

./configure -prefix /work/mywork/qt-in-action/qt-arm -xplatform linux-arm-gnueabi-g++ -opensource -confirm-license -no-opengl -skip location
  1. 编译

根据你的 CPU 核数量决定并行编译的任务数,不确定的话不需要带 -j 参数:

make -j12

这个编译过程会比较长,先喝杯咖啡吧!

  1. 安装
make install

我之前指定的安装路径是 /work/mywork/qt-in-action/qt-arm,进入到这个目录,可以看到如下文件:
在这里插入图片描述
其中 include 为头文件,lib 为编译出来的 QT 库,开发 ARM 架构 QT 应用程序主要用到这两个目录下的文件。我们可以查看一下 Qt 库文件的信息:

$ file libQt5Core.so.5.15.2
libQt5Core.so.5.15.2: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, for GNU/Linux 3.17.0, BuildID[sha1]=17cb846340306bae3fca72a8e65189b775cc7f02, stripped

可以看出,确实是 ARM 架构的库文件。

Qt Creator交叉编译配置

开发 QT 应用程序,最推荐 Qt Creator。虽然有 VS Code 这样的万能开发工具,但 Qt Creator 速度快,集成源码编译、调试,使用起来更顺手。

Qt Creator 默认使用的是系统工具链,要支持开发 ARM 应用程序,还需要配置交叉工具链。

配置 Qt Creator Kits

打开 Qt Creator,然后点击菜单项 Tool | Option
在这里插入图片描述
点击左上的 Kits,然后点击 Qt Versions,接着点击 Add
在这里插入图片描述
在弹出的文件选择对话框中,选择上一步所编译出的 Qt qmake 文件(在 bin 目录下)。
在这里插入图片描述
接下来配置编译器。
在这里插入图片描述
主要是要设置编译器的路径,这里使用系统的交叉工具链,然后点击 Apply
在这里插入图片描述
再点击 Kits Tab,然后点击右边的 Add。
在这里插入图片描述
指定一个名称,C++ 编译器选择前面配置的 ARM-GCC,Qt Version 选择全面配置的 Qt 5.15.2(qt-arm),然后点击 OK,大功告成。
在这里插入图片描述

创建一个测试项目

Qt环境搭建好了,可以新建一个项目试试。

点击菜单项 File | New File or Project … ,打开新建工程向导。这里新建一个 Qt GUI 应用程序。
在这里插入图片描述
项目命名为 FirstArmApp,指定项目目录。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一步 Kit Selection,要选择我们在上一步新建的 Kit ARM Qt 5.15.2。
在这里插入图片描述
在这里插入图片描述
项目建立起来后,可以右键点击项目,然后点击 Build
在这里插入图片描述
项目构建完毕后,我们可以在 build-FirstArmApp-ARM_Qt_5_15_2-Debug 目录看到我们编译出来的第一个 QT ARM 应用程序。

需要注意的是,这个编译出来的 QT 应用程序不能直接在 X86 的 Ubuntu 系统上运行,CPU 架构不同,我们可以查看文件信息。
在这里插入图片描述
把这个应用程序复制到 ARM 版的麒麟或 UOS 系统上,就可以运行。

小结

本文首先介绍了交叉编译的概念,接着介绍了在 Ubuntu Linux 系统上安装 ARM 交叉编译工具链,并使用 ARM 交叉编译工具链编译 QT 源码,得到了 ARM 版的 QT 库,最后介绍在 Qt Creator 中配置交叉工具链,并使用配置的交叉工具链编译出第一个 ARM 架构 QT 应用程序。

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

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

相关文章

一文讲透Python函数中的形式参数和实际参数

函数参数包括形式参数和实际参数&#xff0c;简称形参和实参。其中形式参数即是在定义函数时函数后面括号中的参数列表&#xff08;parameterlist&#xff09;&#xff0c;比如上一个帖子的示例中的width, length&#xff1b;实际参数则是调用函数时函数后面括号中的参数值&…

Docker配置Portainer容器管理界面

目录 一、Portainer 简介 优点&#xff1a; 缺点&#xff1a; 二、环境配置 1. 拉取镜像 2. 创建启动容器 三、操作测试 1. 进入容器 2. 拉取镜像并部署 3. 访问测试 一、Portainer 简介 Portainer 是一个开源的轻量级容器管理界面&#xff0c;用于管理 Docker 容器…

开源免费的物联网网关 IoT Gateway

1. 概述 物联网网关&#xff0c;也被称为IOT网关&#xff0c;是一种至关重要的网络设备。在物联网系统中&#xff0c;它承担着连接和控制各种设备的重要任务&#xff0c;将这些设备有效地连接到云端、本地服务器或其他设备上。它既能够在广域范围内实现互联&#xff0c;也能在…

Docker部署前端项目

某次阿里云的自动流水线失败了&#xff0c;代码本地跑起来莫得问题&#xff0c;错误日志提示让我跑一下npm run build &#xff0c;但是俺忽然发现&#xff0c;我跑了&#xff0c;文件打包好了&#xff0c;但是往哪里运行呢&#xff1f;这涉及到要构建一个环境供打包文件部署吧…

RedissonClient妙用-分布式布隆过滤器

目录 布隆过滤器介绍 布隆过滤器的落地应用场景 高并发处理 多个过滤器平滑切换 分析总结 布隆过滤器介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

Docker部署Grafana+Promethus监控Mysql和服务器

一、Grafana部署所需资源 Grafana 需要最少的系统资源&#xff1a; 建议的最小内存&#xff1a;512 MB建议的最低 CPU&#xff1a;1 官方文档&#xff1a;https://grafana.com/docs/grafana/latest/getting-started/build-first-dashboard/ 可以看到&#xff0c;我的这台服务…

放假--寒假自学版 day1(补2.5)

fread 函数&#xff1a; 今日练习 C语言面试题5道~ 1. static 有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别&#xff1f; 1) 引用必须被初始化&#xff0c;指针不必。 2) 引用初始…

Android中设置Toast.setGravity()了后没有效果

当设置 toast.setGravity()后&#xff0c;弹窗依旧从原来的位置弹出&#xff0c;不按设置方向弹出 类似以下代码&#xff1a; var toast Toast.makeText(this, R.string.ture_toast, Toast.LENGTH_SHORT)toast.setGravity(Gravity.TOP, 0, 0)//设置toast的弹出方向为屏幕顶部…

【Java八股面试系列】JVM-常见参数设置

目录 堆内存相关 显式指定堆内存–Xms和-Xmx 显式新生代内存(Young Generation) 显式指定永久代/元空间的大小 垃圾收集相关 垃圾回收器 GC 日志记录 处理 OOM JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块&#xff0c;Java 堆是所有线…

汇编笔记 01

小蒟蒻的汇编自学笔记&#xff0c;如有错误&#xff0c;望不吝赐教 文章目录 笔记编辑器&#xff0c;启动&#xff01;debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器&#xff0c;启动&#xff01; 进入 debug 模式 debug功能 …

Arm发布新的人工智能Cortex-M处理器

Arm发布了一款新的Cortex-M处理器&#xff0c;旨在为资源受限的物联网&#xff08;IoT&#xff09;设备提供先进的人工智能功能。这款新的Cortex-M52声称是最小的、面积和成本效率最高的处理器&#xff0c;采用了Arm Helium技术&#xff0c;使开发者能够在单一工具链上使用简化…

动漫风博客介绍页面源码

动漫风博客介绍页面源码&#xff0c;HTML源码&#xff0c;图片背景有淡入切换特效 蓝奏云&#xff1a;https://wfr.lanzout.com/iIDZu1nrmjve

Python调用matlab程序

matlab官网&#xff1a;https://ww2.mathworks.cn/?s_tidgn_logo matlab外部语言和库接口&#xff0c;包括 Python、Java、C、C、.NET 和 Web 服务。 matlab和python的版本 安装依赖配置 安装matlab的engine 找到matlab的安装目录&#xff1a;“xxx\ extern\engines\python…

【python量化交易】qteasy使用教程01 - 安装方法及初始化配置

qteasy教程1 - 安装方法及初始化配置 qteasy教程1 - 安装方法及初始配置qteasy安装前的准备工作1&#xff0c; 创建安装环境2&#xff0c;安装MySQL数据库 (可选)安装pymysql 3&#xff0c;创建tushare账号并获取API token (可选)4&#xff0c;安装TA-lib (可选)WindowsMac OSL…

Windows自动化实现:系统通知和任务栏图标自定义

文章目录 Windows自动化的三个小工具系统通知任务栏图标使用pystray实现使用infi.systray实现 Windows自动化的三个小工具 系统通知 import win10toastwin10toast.ToastNotifier().show_toast("eee", "休息一下", icon_path"icon.ico", durati…

uniapp中使用EelementPlus

uniapp的强大是非常震撼的&#xff0c;一套代码可以编写到十几个平台。这个可以在官网上进行查询uni-app官网。主要还是开发小型的软件系统&#xff0c;使用起来非常的方便、快捷、高效。 uniapp中有很多自带的UI&#xff0c;在创建项目的时候&#xff0c;就可以自由选择。而E…

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言内存计算体系结构深度神经网络&#xff08;DNN&#xff09;随机梯度的优…

自然语言处理(NLP)——使用Rasa创建聊天机器人

1 基本概念 1.1 自然语言处理的分类 IR-BOT&#xff1a;检索型问答系统 Task-bot&#xff1a;任务型对话系统 Chitchat-bot:闲聊系统 1.2 任务型对话Task-Bot:task-oriented bot 这张图展示了一个语音对话系统&#xff08;或聊天机器人&#xff09;的基本组成部分和它们之间的…

MYSQL分区NOW()不支持

传说同事写个复杂的SQL代码,跑一次需要7-10秒, 复杂如上,我也懒得去分析 IF IF IF是怎么回事了! 发现此表是分区表,后面要求加上了分区时间,以便利用到分区裁剪技术. 因为需求是查近10天来到期还款的人和金额.就是今天应该还款的人, 一般还款周期是7天. 给个10天的范围挺可以的…