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

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

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

前言

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

这些年国产信创系统开始推广,才有少数人开始有了操作系统的概念,原来除了 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 架构的系统上,是开发人员所要面临的新课题。

交叉工具链

开发针对 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环境搭建好了,可以新建一个项目试试,在新建项目时的Kits选项记得把刚才添加Kits也勾选上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

Awesome Chrome Form UI - 界面设计与实现

上苍不会让所有幸福集中到某个人身上,得到了爱情未必拥有金钱;拥有金钱未必得到快乐;得到快乐未必拥有健康;拥有健康未必一切都会如愿以偿。知足常乐的心态才是淬炼心智、净化心灵的最佳途径。一切快乐的享受都属于精神,这种快乐把忍受变为享受,是精神对于物质的胜利。这…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数&#xff0c;不论是算法竞赛还是找工作面试笔试&#xff0c;对…

STM32单片机的基本原理与应用(六)

串口测试实验 基本原理 在串口实验中&#xff0c;是通过mini_USB线搭建终端与电脑端&#xff08;也可称终端&#xff0c;为做区分称电脑端&#xff09;的“桥梁”&#xff0c;电脑端的串口调试助手通过mini_USB线向终端发送信息&#xff0c;由CH340芯片将USB接口进行转换&…

DelayQueue的使用

具体思路&#xff1a; 在容器初始化的时候就创建出一个 延迟队列 然后项目启动后随即启动一个线程一直监听这个队列 手动调用接口往队列中添加任务 依赖 一个最简单的web的应用即可项目文件结构 第一步&#xff1a;在项目启动的时候就创建出一个延迟队列 Configuration publ…

数据结构 - 线段树

1. 预制值&#xff1a; 构建的数组为&#xff0c;nums&#xff1a;【2&#xff0c; 5&#xff0c; 1&#xff0c; 4&#xff0c; 3】区间和问题&#xff0c;假设求区间 [1&#xff0c;3] 的和 2. 建树 2.1 构建线段树数组 int[] segT new int[4*n]&#xff08;为什么数组大…

理解进程的一些知识准备

1. 认识冯诺依曼体系结构 计算机有很多的体系结构&#xff0c;但到如今&#xff0c;冯诺依曼体系结构变成了主流。 输入设备&#xff1a;话筒、键盘、摄像头、鼠标、磁盘、网卡… 输出设备&#xff1a;声卡、显示器、打印机、显卡、网卡、磁盘… 有的设备既能作为输入设备又能…

机器学习的整个流程

机器学习的整个流程定义了数据科学团队执行以创建和交付机器学习模型的工作流。此外&#xff0c;机器学习流程还定义了团队如何协作合作&#xff0c;以创建最有用的预测模型。 机器学习high level的流程 机器学习流程的关键步骤包括问题探索&#xff08;Problem Exploration&a…

力扣题目训练(7)

2024年1月31日力扣题目训练 2024年1月31日力扣题目训练387. 字符串中的第一个唯一字符389. 找不同401. 二进制手表109. 有序链表转换二叉搜索树114. 二叉树展开为链表52. N 皇后 II 2024年1月31日力扣题目训练 2024年1月31日第七天编程训练&#xff0c;今天主要是进行一些题训…

2024杭州国际安防展览会:引领数字城市安全与智能未来

随着科技的不断进步&#xff0c;数字城市已经成为未来城市发展的重要趋势。作为数字城市建设的重要组成部分&#xff0c;安防技术的创新与应用对于保障城市安全、提高生活品质具有重要意义。为此&#xff0c;2024杭州国际安防展览会将于4月份在杭州国际博览中心隆重召开&#x…

DFS——连通性和搜索顺序

dfs的搜索是基于栈&#xff0c;但一般可以用用递归实现&#xff0c;实际上用的是系统栈。有内部搜索和外部搜索两种&#xff0c;内部搜索是在图的内部&#xff0c;内部搜索一般基于连通性&#xff0c;从一个点转移到另一个点&#xff0c;或者判断是否连通之类的问题&#xff0c…

react将选中本文自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

如何选择日本大带宽服务器?

随着互联网的高速发展&#xff0c;对于大带宽服务器的需求也日益增长。而在日本&#xff0c;由于其先进的网络基础设施和数据中心技术&#xff0c;大带宽服务器成为了许多企业和开发者的首选。那么&#xff0c;如何选择合适的日本大带宽服务器呢? 首先&#xff0c;了解自己的需…

linux☞ Centos 基础篇

切换用户 重启系统、退出 su 用户 ### su switch user 重启系统 reboot 退出当前账户 logout 或者 exit 或者 CtrlD 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet&#xff1a;指明网卡类型为以太网 DEVICEens33&#xff1a;指定当前配置的…

c++类和对象(二)

类与对象 一.类的6个默认成员函数1.1类的6个默认成员函数 二.构造函数2.1.1构造函数的概念2.1.2构造函数的特性 三.析构函数3.1.1概念3.1.2特点 四.拷贝函数4.1.1概念4.1.2特征 一.类的6个默认成员函数 1.1类的6个默认成员函数 在C中&#xff0c;如果在一个类中什么成员都没有…

docker maven插件使用介绍

1、配置docker连接 开放docker tcp连接参考本专栏下令一篇文章 2、docker service窗口 3、根据dockerfile 构建镜像 注意 idea 用通过管理员身份启动&#xff0c;否则连不上docker 构建前添加maven goal 打包 4、运行镜像 创建容器 5、运行docker compose 报错 需要先配置d…

Java并发之synchronized详解

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

QtAV学习:(一)Windows下编译QtAV

QtAV 主页&#xff1a; QtAV by wang-bin 作者的编译构建说明文档&#xff1a; Build QtAV wang-bin/QtAV Wiki GitHub 我的编译环境&#xff1a; 编译环境&#xff1a;win10/msvc2015/Qt5.6.3 第一步&#xff1a;GitHub拉取代码,执行子模块初始化 地址&#xff1a; …

web前端-------弹性盒子(2)

上一讲我们谈的是盒子的容器实行&#xff0c;今天我们来聊一聊弹性盒子的项目属性&#xff1b; *******************&#xff08;1&#xff09;顺序属性 order属性&#xff0c;用于定义容器中项目的出现顺序。 顺序属性值&#xff0c;为整数&#xff0c;可以为负数&#xff…

数仓建设规范

目录 前言 一、数据模型设计规范 1.1 数仓分层原则 1.2 主题域划分原则 1.3 数据模型设计原则 1.4 数据模型管理的目标 1.5 数仓建模的方法 1.5.1 维度建模 1.5.2 三范式建模 1.5.3 三范式与维度建模区别 二、数仓公共开发规范 2.1 层次调用规范 2.2 数据类型规范…