统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
前言
在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。
注意
本篇文章,最终手动结合几个方式成功,花费不少时间研究,推断是终端直接ldd之后强制进入了一个另外的环境变量,导致无法连接成功,也就是,第一层是成功的,第一层的库又调用ldd依赖的这一步的环境变量被强了。
但是最后通过手动来实现linuxdeplopyqt和编译配置来实现打包部署了。
统信UOS系统版本
系统版本:

linuxdeployqt
Linux部署工具linuxdeployqt将应用程序作为输入,并通过将应用程序使用的资源(如库、图形和插件)复制到一个包中使其自包含。结果包可以作为AppDir或AppImage分发给用户,也可以放入交叉分发包中。它可以作为构建过程的一部分,在CMake、qmake和make等系统中部署用C、C++和其他编译语言编写的应用程序。当用于基于Qt的应用程序时,它可以绑定运行应用程序所需的Qt的特定最小子集。
源码下载地址
linuxdeployqt编译(统信UOS系统)
步骤一:下载解压

步骤二:修改源码,去掉gcc版本检查
找到main.cpp源码,将这一段(在192行左右)注释掉(这里通过看源码,实际上是可以通过配置去控制的(研究源码发现的,但是我们不再动作了,只是贴出来):

还是老方法继续修改:
vi linuxdeployqt-master/tools/linuxdeployqt/main.cpp

步骤三:使用cmake配置
cd linuxdeployqt-master
cmake CMakeLists.txt

因为安装了git与这个工程可能不对,我们直接使用源码修改大法,直接定位到代码给删掉:
vi CMakeList.txt
直接删掉目录下的缓存文件:CMakeCache.txt,然后继续:

继续cmake CMakeList.txt
步骤四:配置Qt的依赖环境
麒麟系统本身自带了qt5库(未带开发相关的库),而我们使用了另外安装的qt5,所以依赖需要引入我们自己安装的qt5上。
为了方便配置,也不影响系统我们装上cmake的gui版本:
sudo yum install cmake-gui


cmake-gui
选择对应的路径,然后使用默认unix makefile方式配置:



步骤五:生成generate

步骤六:编译make
切入build目录,并且使用make命令即可:
make

测试程序:

步骤七:安装到系统目录
没有make install这个,手动移动到/usr/local/bin
sudo cp tools/linuxdeployqt/linuxdeployqt /usr/local/bin/

步骤八:测试是否编译成功

linuxdeployqt打包流程(arm看可以,本次pc版本失败)
(PS:虚拟机打包好之后,退回到裸机版本,再测试)
新建一个工程

然后,找个空目录:

未打包在开发机上也可以运行(裸机不行):

这里要将Qt引入环境,为了不影响系统,使用source脚本引入,每次使用之前使用source env.sh引入即可。
touch env.sh
然后输入如下(QT_DIR为安装Qt的路径):
#!/bin/sh
QT_DIR=/home/yang/Qt5.12.8/5.12.8/gcc_64
export PATH=${QT_DIR}/bin:$PATH
export LIB_PATH=${QT_DIR}/lib:$LIB_PATH
export PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATH
export QML2_PATH=${QT_DIR}/qml:$QML2_PATH
export LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATH
echo $PATH
echo $LIB_PATH
echo $PLUGIN_PATH
echo $QML2_PATH
echo $LD_LIBRARY_PATH

引入环境:

下次打包遵循此流程即可,继续打包:

(PS:这里是没有使用sudo进行的打包的,可能对权限管控比较严格,查看“入坑二”)
下面使用sudo打包:
sudo linuxdeployqt testDemo -verbose2

上面是Qt5Widget的库连接到系统库上去了,版本不一样找不到api
下面是未打包的testDemo在开发机上:

下面是未打包的testDemo在裸机上:

手动来实现linuxdeployqt打包
步骤一:应用放过去

(这是开发机,直接运行也是可以的)

步骤二:创建qt.conf
这个文件最重要,他就是调用testDemo应用时候,先加载然后去搜索库路径的配置,没有他则走向系统环境变量了。
touch qt.conf
vi qt.conf
内容,是我们从另外国产麒麟打包的该文件复制的,如下:

# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml
这个时候,我们再运行一次:

路径从本地开始找了。
步骤三:实现其他三个文件夹依赖的拷贝

ls -l
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/translations/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/plugins/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/ . -rf
ls -lh

测试本机可运行了:

(PS:这里是全部copy了库,没有进行依赖裁剪的,暂时不管了,花费时间远超预期了)
步骤四:打包放到裸机上
因为没有裁剪,所以包比较大:
cd ..
tar cvf outManual.tar outManual
ls -l outManual.tar

拷贝到裸机上去。


步骤五:裸机上测试运行(失败)
还是失败,如下:

这还是之前一样,libQt5Widget.so.5依赖libQt5Core.so.5,前面是用当前配置的,然后库的依赖库就强制引入到了/usr/lib64,跟之前linuxdeployqt打包一样的问题。

然后有个念头,于是尝试加上LD_LIBRARY_PATH测试,可以运行成功,具体查看“入坑四”。
步骤六:编译时引入运行时路径pro配置QMAKE_RPATHDIR
为了不在运行时额外添加环境变量,为了打包不出现xcb问题,还得修改一下.pro文件如下图:
# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib

编译出来,单独将testDemo2放置到原来的部署裸机上:

最终,直接点击可以运行成功。
入坑
入坑一:编译linuxdeployqt的依赖Qt路径问题
问题
开始编译的时候,让其依赖了系统,直接导致就算引入了其他qt的环境变量,打包也是依赖系统,直接不打包

原因
怀疑是跟编译linuxdeployqt的依赖有关,所以重做一遍自己安装Qt的cmake。
解决
重做一遍自己安装Qt的cmake后编译,也还是一样的。

入坑二:linuxdeployqt不复制的问题
问题
如前面的入坑,就是不复制,与编译依赖没关系。
尝试
没有办法,直接干linuxdeployqt的main.cpp的源码:
1.先调试哪里没有打印,每次修改源码重新编译之后,部署再打包看输出结果。 (PS:发现qDebug()不输出,输出的是qInfo())



将所有LogError换为qInfo(),如下图:


还是不行:

继续:

棘手的问题:

至此可以确认是兼容性问题,这个问题比较棘手,短期内调不好了。
解决
Linuxdeployqt方式暂未解决,可以换个linuxdeployqt的版本,也许不同的uos版本也不会又这个问题了,很奇怪连LogError和qDebug都不出来。
后续,第二天突然想到是否需要sodu权限,尝试了下,确实是的:

所以又重做,使用sudo来打包了。
入坑三:依赖链接库存在错误
问题

这是和系统的冲突了。
编译的时候也是使用的安装包的:

原因


无解,qmake路径和环境变相也都没有问题

检查linuxdeployqt

尝试1
拍快照,然后目录下的所有/usr/lib64/Qt5*删除,首先检查系统是否正常启用,再打包尝试。
sudo rm /usr/lib64/libQt5*
重启,确实,系统起不来了,系统依赖Qt5.11下的库。

所以不能删除,此路不通。
尝试2
拍快照,然后将安装的Qt5库copy过去,首先检查系统是否正常启用,再打包尝试。
执行copy指令,直接立即黑屏,此路不同。
所以,/usr/lib64下的库是不能动的。

这里怀疑,从进入终端开始就进入了固定的优先环境变量,只是推测,目前linuxdeployqt又花费半天,暂时仍然无解。
解决方法(有点偏门,失败)
找不到一个库就删掉一个库,此时系统是已经将库加载进内存运行,是不影响正在运行的系统,但是无法重启,如下:
sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Gui.so*


sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Core.so*

sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicuuc.so* /usr/lib64/

sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicudata.so* /usr/lib64/

sudo linuxdeployqt testDemo -verbose2
sudo yum install patchelf
sudo linuxdeployqt testDemo -verbose2


可以,uos你赢了,我放弃了!!!
入坑四:手动qt.conf模仿部署还是强制路径切换
问题

原因
分析该系统第二次搜索库,总是会引入到/usr/lib64,这个问题很操蛋,从一开始linuxdeployqt打包不行就是这个根本原因。
解决
直接在编译的时候,最优先的方式,让应用去运行时先依赖相对路径,而不是去依靠运行时的环境变量和配置文件了。
pro加入配置文件:
# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib
点击应用运气的时候,应用自身会先依赖./lib下的库查找。
统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序的更多相关文章
- 系统开发中按下Enter键登录系统
转载来自:http://www.jb51.net/article/54308.htm 系统开发中按下Enter键登录系统,即就是监听键盘,当按下Enter键后调用登录按钮的click()事件. JS方 ...
- acm系统开发笔记
时间: 2016/2/29 遇到的困难: 数据库配置的mysql和java(Date)不一致,出现下面错误 Date date = new Date(); SimpleDateFormat ...
- FFmpeg开发笔记(二)搭建Windows系统的开发环境
由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...
- 项目开发笔记-传单下发 名片替换 文件复制上传/html静态内容替换/json解析/html解析
//////////////////////////// 注意: 此博客是个人工作笔记 非独立demo////////////////////////////////// .............. ...
- 安卓开发笔记——关于Handler的一些总结(上)
接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...
- 初学银河麒麟linux笔记 第六章 发布qt程序
本章参考了@长沙红胖子Qt 的笔记 https://blog.51cto.com/hongpangzi/5788384 这里纪录一下步骤 linux上的QT程序已经能正常编译运行,这里需要进行发布. ...
- 麒麟系统开发笔记(二):国产麒麟系统搭建Qt开发环境安装Qt5.12
前言 开发国产应用,使用到银河麒麟V4,V10,本篇以V10记录,参照上一篇可安装V4.V7.V10三个版本,麒麟V4系自带了Qt,麒麟V10没有自带Qt,需要自己编译搭建环境. 银河麒麟V1 ...
- [APP] Android 开发笔记 006-使用短信验证SDK进行短信验证
1. 下载SDK (http://www.mob.com/#/download) SMS For Android Studio: http://www.mob.com/download/sms/and ...
- iOS陆哥开发笔记(七) (AVFoundation简单介绍)
在AVFoundation框架中AVAudioRecorder类专门处理录音操作,支持多种音频格式. 以下是经常使用的属性和方法: 属性 说明 @property(readonly, getter=i ...
- SSM商城系统开发笔记-配置01-web.xml
先占坑 慢慢填, 商城系统使用主体框架:Spring + Spring MVC + Mybatis 其他框架: 日志: slf4j + logback <!DOCTYPE web-app PUB ...
随机推荐
- 二进制安装Kubernetes(k8s)IPv4/IPv6双栈 v1.24.0
二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 介绍 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 和 1.24 ...
- pandas之loc/iloc操作
在数据分析过程中,很多时候需要从数据表中提取出相应的数据,而这么做的前提是需要先"索引"出这一部分数据.虽然通过 Python 提供的索引操作符"[]"和属性操 ...
- [Linux]常用命令之【top/uptime/w/vmstat/free】
1 top 语法:top [-s time] [-d count] [-q] [-u] [-h] [-n number] [-f filename] -s time 设置屏幕刷新的延时,单位为秒,默认 ...
- day33:进程锁&事件&进程队列&进程间共享数据
目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...
- RDIFramework.NET代码生成器全新V5.0版本发布
RDIFramework.NET代码生成器介绍 RDIFramework.NET代码生成器,代码.文档一键生成. RDIFramework.NET代码生成器集代码生成.各数据库对象文档生成.数据库常用 ...
- ES日志存储以及备份压缩到COS
导语 为了满足用户日益增长的日志存储大小,不影响用户的写入和查询性能.满足不同用户写入流量.同时用户日志长期保存,日志存储比较占用空间和成本.ES集群规格配置高,消耗资源和成本.我们基于Go语言设计了 ...
- java项目 学生成绩管理系统 (源码+数据库文件)
需要的私信我 备注来意:项目名称 来了就点个赞再走呗,即将毕业的兄弟有福了 文章底部获取源码 java项目 学生成绩管理 (源码+数据库文件)技术框架:java+springboot+vue+m ...
- h5新增特性 和 css3 新特性
H5新增: 1)用于绘画 canvas 元素. 2) 用于媒介回放的 video 和 audio 元素. 3)语义化标签 article.footer.header.nav.section3) 4)表 ...
- 如何在Godot中使用ParallaxBackground实现稳定的2d游戏背景[一问随笔]
问题: 我尝试给2d游戏添加静态的背景,当角色运动速度很快时相机的渲染就跟不上角色了,背景会发生这样巨大的位移. 我将Camera2d节点和背景节点绑在一起,但根本无法解决这个问题. 我还尝试制作天空 ...
- Marior去除边距和迭代内容矫正用于自然文档矫正
一.简要介绍 本文简要介绍了论文" Marior: Margin Removal and Iterative Content Rectification for Document Dewar ...