信创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.hqwc.cn/news/454701.html

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

相关文章

有向图的拓扑排序-BFS求解

题目 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列&#xff0c;如果拓扑序列不存在&#xff0c;则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y)&#xff0c;x在A中都出现在y之前&#xff0c;则称…

Vue3开发环境搭建和工程结构(一)

一、NVM和Node.js安装 NVM 是 Node Version Manager&#xff08;Node 版本管理工具&#xff09;的缩写&#xff0c;是一个命令行工具&#xff0c;用于管理和切换到不同版本的 Node.js。 1、前往 nvm-windows 仓库&#xff0c;然后单击立即下载 2、下载最新版本 3 、按照安装向…

HarmonyOS远程真机调试方法

生成密钥库文件 打开DevEco Studio&#xff0c;点击菜单栏上的build&#xff0c; 填一些信息点击&#xff0c;没有key的话点击new一个新的key。 生成profile文件 AppGallery Connect (huawei.com) 进入该链接网站&#xff0c;点击用户与访问将刚生成的csr证书提交上去其中需…

机器学习系列5-特征组合、简化正则化

1.特征组合 1.1特征组合&#xff1a;编码非线性规律 我们做出如下假设&#xff1a;蓝点代表生病的树。橙色的点代表健康的树。 您可以绘制一条直线将生病的树与健康的树清晰地分开吗&#xff1f;不可以。这是一个非线性问题。您绘制的任何线条都无法很好地预测树的健康状况…

redis下载与安装教程(centos下)

文章目录 一&#xff0c;redis下载1.1上传到linux服务器上 二&#xff0c;redis安装2.1 安装依赖2.2 解压包2.3 编译并安装2.4 指定配置启动2.5 设置redis开机自启 一&#xff0c;redis下载 官网&#xff1a; https://redis.io1.1上传到linux服务器上 我用filezila上传到/us…

防御保护---防火墙的可靠性

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.防火墙可靠性概述 防火墙的防护功能基于状态检测的前提下会存在会话表&#xff1b;会话表存在老化时间&#xff0c;仅在流量触发后防火墙会刷新会话表&#xff0c;因此防火墙无法像路由器那样…

如何部署Linux AMH服务器管理面板并结合内网穿透远程访问

文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管…

C++泛编程(4)

类模板高级&#xff08;1&#xff09; 1.类模板具体化部分具体化完全具体化 2.类模板与继承 1.类模板具体化 有了函数模板具体化的基础&#xff0c;学习类模板的具体化很简单。类模板具体化有两种方式&#xff0c;分别为部分具体化和完全具体化。假如有类模板&#xff1a; te…

C++ 哈希表(unordered_map与unordered_set)

文章目录 unordered_map 与 unordered_set哈希表 (Hash Table)哈希函数哈希冲突模拟实现封装 补充&#xff1a;unordered_map 与 unordered_set 的使用 unordered_map 与 unordered_set 就和名字一样&#xff0c;这是 map、set 的无序版本&#xff08;数据遍历出来是无序的&am…

机器学习 - 代价函数

场景 上次简单学习了支持向量机的概念。概念如下&#xff1a; 支持向量机&#xff08;SVM&#xff09;&#xff1a;SVM是一种监督学习算法&#xff0c;常用于分类问题。它的目标是找到一个超平面&#xff08;在二维空间中是一条线&#xff0c;在更高维空间中是一个面&#xf…

把网页打包成app(简单) 2024

文章目录 **01-准备好要打包的网页文件&#xff0c;一般包含HTML-CSS-JS-静态资源文件&#xff1a;****02-下载HBuilderX&#xff0c;注册一个账号-必须****注****册账号****(免费&#xff09;****03-新建一个H5项目&#xff1a;****04-然后把以下红框里面的这些文件都删掉&…

2024年【T电梯修理】报名考试及T电梯修理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新T电梯修理考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过T电梯修理复审考试很简单。 1、【多选题】TSGT7001-2009《检规(简称)…