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

Qt5开发环境-银河麒麟V10ARM平台

目录

      • 前言
      • 1.源码下载
      • 2.编译安装
        • 2.1 安装依赖
        • 2.2 编译
        • 2.3 遇到的问题
        • 2.4 安装
      • 3.编译qtwebengine
        • 3.1 安装依赖库
        • 3.2 编译
        • 3.3 遇到的问题
        • 3.4 安装
      • 4.配置开发环境
      • 5.测试
      • 6.程序无法输入中文的问题
      • 总结

前言

近期因参与开发的某个软件需要适配银河麒麟v10arm 平台,于是自己搭建起一套Qt 开发环境,在此记录下具体过程,以供有需要的朋友参考。一开始手上并没有Arm架构的PC,先在Windows下用Vs2017和QtCreator 开发,软件开发快结束的时候Arm PC到了。Qt 没有提供可直接安装的arm架构安装包,只能自己通过编译Qt 来搭建开发环境。

1.源码下载

下载Qt5.12.7,从这里下载Qt5.12.7 。一定要选择后缀为.tar.xz的源码包,zip源码包亲测编译时会遇到奇怪的问题。
在这里插入图片描述

2.编译安装

2.1 安装依赖

  • 安装OpenGL依赖
    sudo apt-get install build-essential
    sudo apt-get install libgl1-mesa-dev
    sudo apt-get install libglu1-mesa-dev
    sudo apt-get install libegl1-mesa-dev
    sudo apt-get install freeglut3-dev

2.2 编译

打开终端,cd到源码所在目录,执行configure程序并make,这里以编译release版本为例

./configure -prefix  /opt/qt5.12.7  -opensource  -release  -nomake tests -skip qtvirtualkeyboard 接着执行make 命令make -j4

2.3 遇到的问题

编译过程遇到了一些问题,记录如下
1)问题一

/usr/bin/ld.gold:错误:cannot find -lclip2tri
/usr/bin/ld.gold:错误:cannot find -lpoly2tri
/usr/bin/ld.gold:错误:cannot find -lclipper

该问题的原因是qtlocation模块未编译完整,重新执行 make -j4 module-qtlocation 命令 可消除此错误,也可以在执行configure命令的时候添加 -skip qtlocation 来跳过编译。
2)问题二
xcb-xfixes development package not found
这个问题的解决方式是安装对应的软件包,执行下面的命令来安装,安装之后重新执行 make -j4。

sudo apt-get install libxcb-util0-dev

2.4 安装

除此之外还有其他一些小问题,根据错误提示就能解决,没记录下来。
make 结束之后,执行 sudo make install 命令,会将编译好的Qt开发环境安装到之前设置的目录下 /opt/qt5.12.7 。

3.编译qtwebengine

qtwebengine是后期需要引入echarts时才编译的,编译过程中也遇到了一些奇怪的问题,特在此记录下来备忘。qtwebengine需要用到qmake及Qt的一些核心库,因此必须先确保第3节中的qt编译完成。

3.1 安装依赖库

sudo apt-get install bison build-essential gperf flex libasound2-dev\
libcups2-dev libdrm-dev libegl1-mesa-dev libnss3-dev libpci-dev\
libpulse-dev libudev-dev nodejs libxtst-dev gyp ninja-build\
libssl-dev libxcursor-dev libxcomposite-dev libxrandr-dev

在安装 libnss3-dev 时报错,大概意思是版本不对,使用sudo apt-get install libnss3-dev = xxxversion ,安装成功。错误如下:

ibnss3-dev : 依赖: libnss3 (= 2:3.49.1-1kylin1.5) 但是 2:3.49.1-1kylin1.6 正要被安装

解决方法,安装指定版本的依赖包:
sudo apt-get install libnss3=2:3.49.1-1kylin1.5

3.2 编译

打开终端, cd 到 src/qtwebengine 目录下,执行命令:

../qtbase/bin/qmake qtwebengine.pro

3.3 遇到的问题

  • gperf not found

执行完qmake 命令后报错:gperf not found,以为gperf 没有安装成功,再次使用apt-get 安装缺少的依赖,sudo apt-get install gperf ,安装完成后需要将configure命令生成的缓存清除掉然后重新执行configure 命令,并再次执行qmake,命令如下:

rm config.cache
./configure -prefix  /opt/qt5.12.7  -opensource  -release  -nomake tests -skip qtvirtualkeyboard 
../qtbase/bin/qmake qtwebengine.pro
make -j4
  • X11/Xlib-xcb.h 找不到
    不出意外开始编译了,经过漫长的等待,编译又出错了,这次遇到的是:fatal error X11/Xlib-xcb.h 文件不存在。第一感觉是缺少对应的库,经过一番查找发现需要安装 libx11-dev ,于是执行 sudo apt-get install libx11-dev,成功安装后仍然报错。通过find命令查找该头文件,确实没有找到 find /usr -name Xlib-xcb.h 。 我耐着性子查询了很多资料还是没能解决问题,这时只剩下最后一条路了,那就是下载libx11-dev源码,从libx11地址下载系统libX11版本对应的libx11-dev源码后,与当前系统/usr/lib/include/X11 目录进行比较发现系统重确实少了Xlib-xcb.h 文件,而下载的源码中刚好有这个文件,于是将 Xlib-xcb.h 复制到 /usr/lib/include/X11 目录下,重新执行 make -j4 继续编译。
  • libXlib-xcb.so 找不到
    又是漫长的等待过后报了一个错,这次是 libXlib-xcb.so 找不到,通过find命令发现在 /usr/lib/arm-linux-gnueabihf/ 目录下有这个库,根据报错信息提示在/usr/lib/aarch64-linux-gnu/ 目录下创建了一个 软连接 ln -s /usr/lib/arm-linux-gnueabihf/libXlib-xcb.so libXlib-xcb.so, 接着再次执行make -j4 ,这次没有提示libXlib-xcb.so 找不到,而是提示libXlib-xcb.so 不兼容。
  • libXlib-xcb.so 不兼容
    针对这个问题,我打算重新编译libXlib 库。首先安装libtool 和 autoconfig
sudo apt-get install libtool autoconf

切换到libXlib 源码根目录下 执行

 ./autogen.shconfigure.ac:24: error: must install xorg-macros 1.15 or later before running autoconf/autogen

下载对应的 rpm 安装包,下载地址

sudo rpm -ivh xorg-x11-util-macros-1.19.3-4.el9.noarch.rpm --nodeps --force

安装后再次执行

./autogen.sh
make 

编译结束后会生成libXlib-xcb.so ,把库拷贝到/usr/lib 目录下, 删除之前创建的 /uar/lib/aarch64-linux-gnu 目录下的软连接,重新创建对应的软连接,然后回到qtwebengine 根目录下再次 执行 make -j4

  • open CFI at the end of file; missing .cfi_endproc directive
    这个问题是qtwebengine 编译过程中由于占用内存太多,而系统内存不足导致的报错。我用的设备内存是8G,交换空间是9G,为了解决这个问题将交换空间增加了20G,最终才编译成功。

以下是增加交换空间用到的几个命令:

#创建swap文件
mkdir -p /var/cache/swap
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=1G count=20
#转换swap文件
sudo mkswap -f /var/cache/swap/swap0
#激活swap文件
sudo swapon /var/cache/swap/swap0
#卸载
sudo swapoff /var/cache/swap/swap0
#永久生效
sudo vim /etc/fstab
#写入以下内容:
/var/cache/swap/swap0 none swap defaults 0 0

再次执行make -j4这次成功生成了 libQt5WebEngine 等几个qtwebengine 用到的库。

3.4 安装

在qtwebengine 根目录下执行sudo make install ,生成的库会自动安装到/opt/qt5.12.7目录下。

4.配置开发环境

首先在软件商店中下载并安装QtCreator,安装完成之后配置QtVersion 、编译器、Kits等。可以参考这篇文章配置链接

5.测试

新建一个项目,运行测试。这里遇到一个问题,程序可正常编译运行,但是源码文件确报错 unexpected class name,这是因为缺少一个软件包,通过安装这个软件包解决了此问题,安装命令如下:

sudo apt-get install libclang-common-8-dev

安装完成后重启QtCreater,不会再出现上面的问题了。

6.程序无法输入中文的问题

经过查询发现是插件问题,自己编译的qt开发环境中缺少插件 libfcitxplatforminputcontextplugin.so,这里有两个办法解决这个问题,一个是下载源码自己编译该插件,另一个是在系统中找到这个插件,并拷贝到对应的插件目录中。这里采用第二种方式解决了该问题,如果第二种方式不能解决,那就尝试用第一种方式自己编译插件吧。

总结

从零开始搭建麒麟系统arm平台下的Qt开发环境还是挺折磨人的,在这个过程中会遇到很多新的问题,只有自己动手实践一遍才能真正体会。我把完整的qt环境上传到git上了,如果你也刚好需要而又不想折腾的话可以直接下载使用。下载地址:
以上就是本篇的所有内容了,欢迎评论区留言讨论!!!

相关文章:

Qt5开发环境-银河麒麟V10ARM平台

目录 前言1.源码下载2.编译安装2.1 安装依赖2.2 编译2.3 遇到的问题2.4 安装 3.编译qtwebengine3.1 安装依赖库3.2 编译3.3 遇到的问题3.4 安装 4.配置开发环境5.测试6.程序无法输入中文的问题总结 前言 近期因参与开发的某个软件需要适配银河麒麟v10arm 平台,于是…...

「Qt」文件读写操作

0、引言 我们知道 C 和 C 都提供了文件读写的类库,不过 Qt 也有一套自己的文件读写操作;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile。 1、QFileDialog 文件对话框 一般的桌面应用程序,当我们想要打开一个文件时,通常会弹…...

0101前期准备-大数据学习

文章目录 1 前言2 配置VMware虚拟机2.1 设置主机名和固定IP2.2 本地系统与Linux系统配置主机名映射2.3 配置虚拟机之间用户的SSH免密互通2.4 安装JDK环境2.5 关闭防火墙和SELinux2.6 更新时区和同步时间2.7 保存虚拟机快照 结语 1 前言 我们从基础的hadoop开始学起,…...

TypeScript教程(四)基本运算符

一、运算符 TypeScript包含以下几种运算符: 1.算术运算符 2.逻辑运算符 3.关系运算符 4.按位运算符 5.赋值运算符 6.三元/条件运算符 7.字符串运算符 8.类型运算符 1.算术运算符 y5 运算符描述例子x 运算结果y 运算结果加法xy275-减法xy-235*乘法xy*2105…...

计算机网络的性能指标

计算机网络的性能指标 1. 速率 速率是指数据在网络中传送的速度,通常用比特率或数据率来表示,单位是b/s,或bit/s,即比特每秒,或者bps(bit per second)。 速率单位:1 Ybps 10^24 bps(尧), 1 Zbps 10^21…...

BBS项目day04 文章详情页、点赞点菜、评论功能

一、路由 from django.contrib import admin from django.urls import path, re_path from app01 import views from django.views.static import serve from django.conf import settingsurlpatterns [path(admin/, admin.site.urls),# 注册path(register/, views.register)…...

el-table分页后序号连续的两种方法

实现效果&#xff1a; 第一页排序到10&#xff0c;第二页的排序应从11开始 实现方法一&#xff1a; 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…...

Nginx反向代理技巧

跨域 作为一个前端开发者来说不可避免的问题就是跨域&#xff0c;那什么是跨域呢&#xff1f; 跨域&#xff1a;指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对javascript施加的安全限制。浏览器的同源策略是指协议&#xff0c;域名…...

kafka--kafka的基本概念-副本概念replica

三、kafka的基本概念-副本概念replica Broker 表示实际的物理机器节点 Broker1中的绿色P1表示主分片Broker2中的蓝色P1表示副本分片&#xff0c;其余类似&#xff0c;就是主从的概念&#xff0c;如果一个Broker挂掉了&#xff0c;还有其它的节点来保证数据的完整性 P可以看做分…...

css伪元素实现li列表圆点相连+锚点跳转悬浮窗实现

实现效果&#xff1a; html代码&#xff1a; <div class"sidenav"><ul class"nav-text progressbar"><!-- data-target的值对应要跳转的模块的id --><li data-target"module1"><div class"text">锚点…...

IronPDF for .NET Crack

IronPDF for .NET Crack ronPDF现在将等待HTML元素加载后再进行渲染。 IronPDF现在将等待字体加载后再进行渲染。 添加了在绘制文本时指定旋转的功能。 添加了在保存为PDFA时指定自定义颜色配置文件的功能。 IronPDF for.NET允许开发人员在C#、F#和VB.NET for.NET Core和.NET F…...

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解&#xff08;多态篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;多态篇&#xff09;多态的概念多态的定义及实现多态的构成条件&#xff08;重点&#xff09;虚函数虚函数的重写&#xff08;覆盖、一种接口继承&#xff09;C11 override…...

excel快速选择数据、选择性粘贴、冻结单元格

一、如何快速选择数据 在excel中&#xff0c;希望选择全部数据&#xff0c;通常使用鼠标选择数据然后往下拉&#xff0c;当数据很多时&#xff0c;也可单击单元格使用ctrl A选中全部数据&#xff0c;此外&#xff0c;具体介绍另一种方法。 操作&#xff1a;ctrl shift 方向…...

【数仓建设系列之一】什么是数据仓库?

一、什么是数据仓库&#xff1f; 数据仓库(Data Warehouse&#xff0c;简称DW)简单来讲&#xff0c;它是一个存储和管理大量结构化和非结构化数据的存储集合&#xff0c;它以主题为向导&#xff0c;通过整合来自不同数据源下的数据(比如各业务数据&#xff0c;日志文件数据等)…...

Vue2-配置脚手架、分析脚手架、render函数、ref属性、props配置项、mixin配置项、scoped样式、插件

&#x1f954;:总有一段付出了没有回报的日子 是在扎根 更多Vue知识请点击——Vue.js VUE2-Day6 配置脚手架脚手架结构render函数vue.js与vue.runtime.xxx.js的区别引入render函数为什么要引入残缺的vue呢&#xff1f; 脚手架默认配置ref属性props配置项传递数据接收数据注意点…...

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)

本例主要讲一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部内容&#xff0c;VC2015项目加载内存中的DLL函数&#xff0c;并调用函数的示例。 本例中的示例代码下载&#xff0c;点击可以下载 一、VC6.0生成示例DLL项目 1.新建项目&#xff0c;…...

人流目标跟踪pyqt界面_v5_deepsort

直接上效果图 代码仓库和视频演示b站视频006期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…...

angular 子组件ngOnChanges监听@input传入的输入属性

在进入主题之前&#xff0c;先了解一下angular的生命周期。 生命周期 钩子分类 指令与组件共有的钩子 ngOnChangesngOnInitngDoCheckngOnDestroy 组件特有的钩子 ngAfterContentInitngAfterContentCheckedngAfterViewInitngAfterViewChecked 生命周期钩子的作用及调用顺序 …...

移植PeerTalk开源库IOS的USB通信监听服务到QT生成的FFmpeg工程

1.添加生成的PeerTalk库 下图选中部分为FFmpeg依赖库 将USB通信服务的m与h文件添加到工程 因为OC文件使用了弱指针,所以要启用弱指针支持 因为FFmpeg拉流动用到本地网络,所以要在plist文件中启动本地网络使用 设置PeerTalk为嵌入模式 设置Runpath Search Paths为@executable_p…...

PHREEQC模型化学热力学理论和数据库.dat、各种模拟反应平衡反应模拟、化学动力模拟、反应迁移模拟

PHREEQC是一个用于计算多种低温水文地球化学反应的计算机软件&#xff0c;以离子缔合水模型为基础的PHREEQC能够&#xff08;1&#xff09;计算物质形成种类与饱和指数&#xff1b;&#xff08;2&#xff09;模拟地球化学反演过程&#xff1b;&#xff08;3&#xff09;计算批反…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...