国产系统下开发QT程序总结

国产系统下开发QT程序总结

1. 国产系统简介

开发国产系统客户端的过程中,会出现兼容性问题。以下介绍Kylin和UOS环境下开发QT程序,
首先麒麟和统信这两个系统基于Ubuntu开发的。所以在Ubuntu开发理论上在国产系统上也能运行。芯片架构又分为amd,arm,mips架构,三个芯片架构不能互通,但是同样架构芯片的Ubuntu开发程序理论上在国产系统上也是兼容的(验证了Kylin和UOS的程序在Ubuntu是可以运行的)。

2. 工具安装

2.1 QT

桌面Linux一般自带QT库,但发布就不用用自带的QT发布,因为一些库不全。
如果只是个人开发,下载qt-creator即可,但是要发布,QT依赖库不缺失,就必须安装一个新的qt编译器。
amd架构
以5.12.12为例,下载链接如下
https://download.qt.io/archive/qt/5.12/5.12.12/qt-opensource-linux-x64-5.12.12.run
在这里插入图片描述
在这里插入图片描述

gcc和Creator必须要选,这样amd架构下qt和qmake就安装好了。
注意官网提供的安装包是amd架构的,arm架构的电脑是识别不了的。
arm架构
这时候就需要编译源码了,下载位置为
在这里插入图片描述
single目录下面的为对应版本的源码,编译QT源码的博客可以参考其他博客
编译过程中要sudo管理员权限否则可能编译不通过
QtCreator只需要下载默认版本即可
sudo apt install qt-default
QtCreator只是一个IDE,安装QtCreator在国产系统会找到,不要用系统自带的QT,这样打包出的安装包如果在另一台系统QT版本不一样或者没有QT的电脑就运行不了。

2.2 打包工具

这里有一个坑,就是网上的博客有的做法是将依赖库通过脚本拷贝到运行程序下,这种做法是不可靠的,因为QT程序运行时不止去找直接依赖的库,还会加载QT平台,实际上找的还是系统自带的QT。如果系统QT版本不一样,或者没有QT就运行不起来了。
解决方案是用qt工具打包linuxdeployqt,下载地址https://github.com/probonopd/linuxdeployqt
这篇博客介绍的很详细
https://blog.csdn.net/weixin_40293570/article/details/111627158
注意事项:
在编译linuxdeployqt工具时,当前qt选择的版本是编译程序的qt版本
qmake -v即可查看当前qt的版本

qmake -v
cd linuxdeployqt
qmake
make
sudo make install
sudo mv bin/linuxdeployqt /usr/local/bin/

确保linuxdeployqt和你程序的qt版本一样,很重要
在打包之前还需要在系统环境中配置你编译程序的QT位置

vim .bashrc
export PATH=/home/用户名/5.9.6/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/用户名/5.9.6/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/用户名/5.9.6/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/用户名/5.9.6/gcc_64/qml:$QML2_IMPORT_PATH
source ~/.bashrc

环境配置好后就可以用工具打包了

linuxdeployqt demo -verbose2

这里因为我安装包是单独打包的,用这个工具主要是解决QT依赖的问题。linuxdeployqt 应该也可以完整打包的在这里插入图片描述
打包后结构如上,字体没有加载的时候,会提示lib没有fonts加上即可
在这里插入图片描述
这时候配置文件qt.conf会指定qt的位置
这个工具会解决QT依赖的问题。
但是除QT的依赖问题还需要自己解决。

3. 依赖问题

3.1 C++版本过高

C++过高会出现libc.so和libstdc++.so没有对应得到C版本,解决办法是用低版本编译。

3.2 依赖库缺失

3.2.1 依赖库直接依赖缺失

在这里插入图片描述
解决方法是在.pro文件时指定搜索路径为指定位置。这样运行程序会优先搜索指定路径下是否有对应的库。

3.2.2 依赖库间接依赖缺失

在这里插入图片描述
比如libfreetype为运行程序依赖的库,这个可以在编译链接时指定位置,但是libfreetype本身依赖的库缺失,这时候就找不到依赖的库,但是程序还是可以运行的,可以用的这个库的时候才会出问题,运行程序直接依赖的库缺失会直接运行不起来的。
这时候就需要编译freetype的源码,并且在搜索依赖库的时候指定搜索路径

./configure --prefix=/usr/local LDFLAGS=-Wl,-rpath=.

其中–prefix是指定安装位置 ,LDFLAGS=-Wl,-rpath=.是自定义依赖库搜索路径
这里用的是相对路径
在这里插入图片描述
make -j 8
make install
编译并安装

在这里插入图片描述
在这里插入图片描述
这时候查看libfreetype.so的依赖库发现还是指向系统但是单独拿出libfreetype.so,并把libfreetype.so依赖库放在同层目录就会发现指向当前目录下
在这里插入图片描述
在这里插入图片描述
替换原来的libfreetype并建立软链接,取代之前的freetype.so库,依赖库指向当前目录、

在这里插入图片描述
程序可以正常运行,并且这台电脑没有qt环境,其他类似的问题也可以通过这种方式解决

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

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

相关文章

pythonapi接口怎么对接?

Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式。API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议。通过使用Python API接口,可以轻松地访问和操作外部API提供…

飞凌嵌入式受邀参加「RISC-V芯片应用交流会」并发表主题演讲

8月23日下午,在第三届RISC-V中国峰会现场,由赛昉科技主办的「RISC-V芯片应用交流会」吸引了诸多行业伙伴和专家到场参与。此次会议旨在分享赛昉科技高性能RISC-V芯片的软件生态、应用产品、解决方案等全面进展,共同探讨RISC-V芯片的未来发展和…

Git 删除已经合并的本地分支

在使用 Git 的开发流程中,经常会创建很多的 Git 分支,包括功能分支(features/*)、发布分支(release/*)和 hotfix 分支(hotfix/*)。在开发了一段时间之后,本地就会有出现很…

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;

Java --- 异常处理

目录 一、什么是异常 二、异常抛出机制 三、如何对待异常 四、 Java异常体系 4.1、Throwable 4.2、Error 4.2、Exception 4.2.1、编译时异常 4.2.2、运行时期异常 五、异常处理 5.1、捕获异常(try-catch) 5.1.2、catch中异常处理方式 …

你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?

一、什么是SPA SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验在单页应用中,所有必…

TCP的三次握手 四次挥手以及TCP的11种状态

三次握手流程: 客户端给服务端发送数据时,数据包中带有一个头,这个头就是前几十个字节,就是下面这张图。从源端口号,目的端口号,一直到序列号,直到Options。第一个包会将这前十几个字节中的SYN置…

12. 完整模型训练套路

12.1 CIFAR 10 model 网络模型 ① 下面用 CIFAR 10 model网络来完成分类问题,网络模型如下图所示。 12.2 DataLoader加载数据集 import torchvision from torch import nn from torch.utils.data import DataLoader# 准备数据集 train_data torchvision.dataset…

C#,《小白学程序》第二课:数组与排序

1 文本格式 /// <summary> /// 《小白学程序》第二课&#xff1a;数组与排序 /// </summary> /// <param name"sender"></param> /// <param name"e"></param> private void button2_Click(object sender, EventArgs …

RT-Thread内核学习

内核框架 内核是操作系统最基础也是最重要的部分&#xff0c;内核处于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。这部分根据编译器不同自带C库的情况也会不同。 当使用GNU GCC编译器时&…

Vue.js中,router和route

<div class"search">{{$route.params.things}}<van-nav-bar fixed title"商品列表" left-arrow click-left"$router.go(-1)" /><van-searchreadonlyshape"round"background"#ffffff"value"手机"sh…

Unity Mac踩坑日记

1、读取外部文件夹使用IO&#xff0c;读取StreamingAsset或者Unity定义文件夹或者服务器文件使用www或者UnityRequest 2、mac下使用www 需要添加前缀&#xff1a;"file://" 3、Mac下的Rider很好用&#xff0c;断点调试也很方便 4、改变文件编码格式&#xff0c;使…

kotlin如何接收前端传递过来的数据

Kotlin 可以使用 Spring Boot 等框架来接收前端传递过来的数据。 在 Spring Boot 中&#xff0c;你可以使用 RequestBody 注解来将前端传递的 JSON 格式数据转换为相应的 Kotlin 对象。 示例代码&#xff1a; RestController RequestMapping("/api") class UserCo…

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…

C++数据结构学习——栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言 栈&#xff08;Stack&#xff09;是计算机科学中一种常见的数据结构&#xff0c;它是…

菜鸟教程《Python 3 教程》笔记(6):列表

菜鸟教程《Python 3 教程》笔记&#xff08;6&#xff09; 6 列表6.1 删除列表元素6.2 列表函数和方法6.2.1 max()、min()6.2.2 reverse()6.2.3 sort() 6 列表 出处&#xff1a; 菜鸟教程 - Python3 列表 6.1 删除列表元素 >>> list [Google, Runoob, 1997, 2000]…

前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。 1 性能指标 2 分析方法 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序&#xff0c;Performace观察页面渲染表现及JS执行情况&#xff0c;Lighthouse对网站进行整体评分…

01、前端使用 thymeleaf 后,视图页面找不到---Cannot resolve MVC View ‘xxxxx前端页面‘

Cannot resolve MVC View ‘xxxxx前端页面’ 没有找到对应的mvc的前端页面。 代码&#xff1a;前端这里引入了 thymeleaf 模板 解决&#xff1a; 需要添加 thymeleaf 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

QT通过ODBC连接GBase 8s数据库(Windows)示例

示例环境&#xff1a; 操作系统&#xff1a;Windows 10 64位数据库及CSDK版本&#xff1a;GBase 8s V8.8_3.0.0_1 64位QT&#xff1a;5.12.0 64位 1&#xff0c;CSDK安装及ODBC配置 1.1&#xff0c;免安装版CSDK 下载免安装版的CSDK驱动&#xff0c;地址&#xff1a;https:…

对于库存扣减问题的一些思考

最近在做公司WMS库存模块的需求&#xff0c;所以网上查阅了一些库存扣减相关的文章学习了一下。 方案 我们先来看看都有哪些扣减方案&#xff0c;各自优缺点给 方案一&#xff1a;查出库存&#xff0c;然后减去扣减数量&#xff0c;再更新回数据库 select stock_num from t…