统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

这篇具有很好参考价值的文章主要介绍了统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131411975文章来源地址https://www.toymoban.com/news/detail-502428.html

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

国产麒麟系统、统信UOS系统相关开发

上一篇:《统信UOS系统开发笔记(六):提取在线安装软件后,提取其安装包,部署目标机使用离线软件包方式安装软件》
下一篇:《统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)》


前言

  在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。


注意

  本篇文章,最终手动结合几个方式成功,花费不少时间研究,推断是终端直接ldd之后强制进入了一个另外的环境变量,导致无法连接成功,也就是,第一层是成功的,第一层的库又调用ldd依赖的这一步的环境变量被强了。
  但是最后通过手动来实现linuxdeplopyqt和编译配置来实现打包部署了。


相关博客

  《Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败) 》
  《关于 QWidget+Qml程序打包到ubuntu时,程序与系统库版本不同,编译时添加并依赖自带库 的方法》
  《Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序》
  《麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序》


统信UOS系统版本

  系统版本:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序


linuxdeployqt

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

源码下载地址

  csdn粉丝0积分下载地址:https://download.csdn.net/download/qq21497936/86803960
  gitcode地址:https://gitcode.net/mirrors/probonopd/linuxdeployqt


linuxdeployqt编译(统信UOS系统)

步骤一:下载解压

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤二:修改源码,去掉gcc版本检查

  找到main.cpp源码,将这一段(在192行左右)注释掉(这里通过看源码,实际上是可以通过配置去控制的(研究源码发现的,但是我们不再动作了,只是贴出来):
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  还是老方法继续修改:

vi linuxdeployqt-master/tools/linuxdeployqt/main.cpp

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤三:使用cmake配置

cd linuxdeployqt-master
cmake CMakeLists.txt

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  因为安装了git与这个工程可能不对,我们直接使用源码修改大法,直接定位到代码给删掉:

vi CMakeList.txt

  直接删掉目录下的缓存文件:CMakeCache.txt,然后继续:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  继续cmake CMakeList.txt

步骤四:配置Qt的依赖环境

  麒麟系统本身自带了qt5库(未带开发相关的库),而我们使用了另外安装的qt5,所以依赖需要引入我们自己安装的qt5上。
  为了方便配置,也不影响系统我们装上cmake的gui版本:

sudo yum install cmake-gui

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

cmake-gui 

  选择对应的路径,然后使用默认unix makefile方式配置:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤五:生成generate

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤六:编译make

  切入build目录,并且使用make命令即可:

make

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  测试程序:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤七:安装到系统目录

  没有make install这个,手动移动到/usr/local/bin

sudo cp tools/linuxdeployqt/linuxdeployqt /usr/local/bin/

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序


linuxdeployqt打包流程(arm看可以,本次pc版本失败)

  (PS:虚拟机打包好之后,退回到裸机版本,再测试)
  新建一个工程
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  然后,找个空目录:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  未打包在开发机上也可以运行(裸机不行):
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  这里要将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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  引入环境:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  下次打包遵循此流程即可,继续打包:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

sudo linuxdeployqt testDemo -verbose2

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  上面是Qt5Widget的库连接到系统库上去了,版本不一样找不到api
  下面是未打包的testDemo在开发机上:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  下面是未打包的testDemo在裸机上:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序


手动来实现linuxdeployqt打包

步骤一:应用放过去

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  (这是开发机,直接运行也是可以的)
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤二:创建qt.conf

  这个文件最重要,他就是调用testDemo应用时候,先加载然后去搜索库路径的配置,没有他则走向系统环境变量了。

touch qt.conf
vi qt.conf

  内容,是我们从另外国产麒麟打包的该文件复制的,如下:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml

  这个时候,我们再运行一次:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  路径从本地开始找了。

步骤三:实现其他三个文件夹依赖的拷贝

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  测试本机可运行了:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  (PS:这里是全部copy了库,没有进行依赖裁剪的,暂时不管了,花费时间远超预期了)

步骤四:打包放到裸机上

  因为没有裁剪,所以包比较大:

cd ..
tar cvf outManual.tar outManual
ls -l outManual.tar

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  拷贝到裸机上去。
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

步骤五:裸机上测试运行(失败)

  还是失败,如下:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  这还是之前一样,libQt5Widget.so.5依赖libQt5Core.so.5,前面是用当前配置的,然后库的依赖库就强制引入到了/usr/lib64,跟之前linuxdeployqt打包一样的问题。
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  然后有个念头,于是尝试加上LD_LIBRARY_PATH测试,可以运行成功,具体查看“入坑四”。

步骤六:编译时引入运行时路径pro配置QMAKE_RPATHDIR

  为了不在运行时额外添加环境变量,为了打包不出现xcb问题,还得修改一下.pro文件如下图:

# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  编译出来,单独将testDemo2放置到原来的部署裸机上:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
  最终,直接点击可以运行成功。


入坑

入坑一:编译linuxdeployqt的依赖Qt路径问题

问题

  开始编译的时候,让其依赖了系统,直接导致就算引入了其他qt的环境变量,打包也是依赖系统,直接不打包
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

原因

  怀疑是跟编译linuxdeployqt的依赖有关,所以重做一遍自己安装Qt的cmake。

解决

  重做一遍自己安装Qt的cmake后编译,也还是一样的。
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

入坑二:linuxdeployqt不复制的问题

问题

  如前面的入坑,就是不复制,与编译依赖没关系。

尝试

  没有办法,直接干linuxdeployqt的main.cpp的源码:
  1.先调试哪里没有打印,每次修改源码重新编译之后,部署再打包看输出结果。  (PS:发现qDebug()不输出,输出的是qInfo())
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  将所有LogError换为qInfo(),如下图:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  还是不行:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  继续:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  棘手的问题:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  至此可以确认是兼容性问题,这个问题比较棘手,短期内调不好了。

解决

  Linuxdeployqt方式暂未解决,可以换个linuxdeployqt的版本,也许不同的uos版本也不会又这个问题了,很奇怪连LogError和qDebug都不出来。
  后续,第二天突然想到是否需要sodu权限,尝试了下,确实是的:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  所以又重做,使用sudo来打包了。

入坑三:依赖链接库存在错误

问题

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  这是和系统的冲突了。
  编译的时候也是使用的安装包的:
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

原因

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  无解,qmake路径和环境变相也都没有问题
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  检查linuxdeployqt
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

尝试1

  拍快照,然后目录下的所有/usr/lib64/Qt5*删除,首先检查系统是否正常启用,再打包尝试。

sudo rm /usr/lib64/libQt5*

  重启,确实,系统起不来了,系统依赖Qt5.11下的库。
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  所以不能删除,此路不通。

尝试2

  拍快照,然后将安装的Qt5库copy过去,首先检查系统是否正常启用,再打包尝试。
  执行copy指令,直接立即黑屏,此路不同。
  所以,/usr/lib64下的库是不能动的。
  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  这里怀疑,从进入终端开始就进入了固定的优先环境变量,只是推测,目前linuxdeployqt又花费半天,暂时仍然无解。

解决方法(有点偏门,失败)

  找不到一个库就删掉一个库,此时系统是已经将库加载进内存运行,是不影响正在运行的系统,但是无法重启,如下:

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

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

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

  可以,uos你赢了,我放弃了!!!

入坑四:手动qt.conf模仿部署还是强制路径切换

问题

  统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序

原因

  分析该系统第二次搜索库,总是会引入到/usr/lib64,这个问题很操蛋,从一开始linuxdeployqt打包不行就是这个根本原因。

解决

  直接在编译的时候,最优先的方式,让应用去运行时先依赖相对路径,而不是去依靠运行时的环境变量和配置文件了。
  pro加入配置文件:

# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib

  点击应用运气的时候,应用自身会先依赖./lib下的库查找。


上一篇:《统信UOS系统开发笔记(六):提取在线安装软件后,提取其安装包,部署目标机使用离线软件包方式安装软件》
下一篇:《统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)》


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131411975

到了这里,关于统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 统信UOS操作系统安装

    常见的linux国产修改版本,有深度的linux(Deepin)、红旗Linux、银河麒麟、中标麒麟Linux、统信UOS。大家可能听说过深度linux,在众多国产linux修改版本中,深度的体验可以说算得上不错的。而统信UOS开发和维护是深度团队,只不过Deepin是社区版系统,而统信UOS是商业版系统。今天

    2024年02月07日
    浏览(58)
  • 统信UOS + Windows双系统安装教程

    全文导读:本文主要介绍了AMD架构下(Intel/amd/兆芯/海光)的机器同时安装Windows系统+UOS系统的方法。 1、下载好UOS系统镜像(AMD64),下载地址:https://www.chinauos.com/resource/download-professional 2、下载好windows系统镜像,由于版权原因请自行百度查找下载地址进行下载; 3、制作U盘

    2024年02月04日
    浏览(86)
  • 统信 UOS 系统如何安装及升级 python

            最近因工作需要,台式机及笔记本均换为国产机,分别为联想开天 M630Z (uniontechos-desktop-20-professional-1043-amd64)及华为擎云 L410 (uniontechos-desktop-20-professional-1040-arm64),均为国产操作系统统信 UOS。         问题来了,因为博主一直习惯于 Windows 操作系统,面对

    2023年04月08日
    浏览(57)
  • uos统信系统配置本地源APT

    目录 1,将光盘挂载到/mnt下面   2,配置本地源(apt) 3,更新源 4,测试                   (1),vi /etc/apt/sources.list 进入 编辑            (2),在里面添加  deb [trusted=yes] file:///mnt fou main

    2024年02月09日
    浏览(45)
  • 统信UOS服务器系统-如何查看版本信息

    在统信服务器操作系统V20官网镜像下载列表里面看,有A版(兼容OpenAnolis社区技术路线)和E版(兼容openEuler社区技术路线)镜像的区别,但从版本发行标记里面看,从1050之后,都是同时发布,应该是版本进行了融合,实现了发版节奏一致,使用习惯和兼容性基本一致,特殊应

    2024年04月11日
    浏览(58)
  • 统信UOS操作系统上禁用IPv6

    原文链接:统信UOS操作系统上禁用IPv6 hello,大家好啊!继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后,今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议,但在某些特定的网络环境或测试场景中,可能需要禁用IPv6以确保兼容性或满足

    2024年01月17日
    浏览(57)
  • 统信UOS桌面操作系统教育版的安装方法

    原文链接:统信UOS桌面操作系统教育版的安装方法 hello,大家好!继我们之前详细介绍了统信UOS桌面操作系统的专业版、服务器版以及家庭版安装方法之后,今天我将带大家了解如何安装统信UOS的教育版,使用的是最新的1060镜像。 统信UOS教育版是专为教育环境设计的操作系

    2024年01月20日
    浏览(74)
  • 使用U盘安装统信UOS20服务器操作系统1050a出现“设置基础软件仓库时出错”报错导致无法继续安装的解决方法

    目录 一、复现步骤  二、解决方法 操作系统版本:统信操作系统UOS--20-1050a-amd64 使用Rufus工具制作U盘启动盘或者使用UltraISO工具制作U盘启动盘; 修改启动项,选择从U盘启动; 这里看机器是什么品牌或者组装机,有如联想F12、华硕F2等 进入系统安装界面,这里可以看到在“软

    2024年02月15日
    浏览(256)
  • 统信服务器操作系统UOS V20 各个版本说明

    统信的操作系统 A结尾的是基于龙蜥 OpenAnolis  D结尾的是基于 debian 10  E结尾的是基于欧拉 OpenEuler  安装后可以通过/etc下的文件来分辨 A版安装好以后可以 cat /etc/redhat-release D版安装好以后可以 cat /etc/debian_version E版安装好以后可以  cat /etc/UnionTech-release 如何选择 如果你习惯

    2024年02月09日
    浏览(50)
  • 全网最细(UOS)统信系统上安装Java环境和IDEA

    通过命令:uname -m 查看  他可能会返回  X86_64 或者 aarch64 我目前的系统返回的是aarch64的,所有以下下载的都是aarch64相关的包。 一定要先看自己的系统架构是什么!!!一定要先看自己的系统架构是什么!!!一定要先看自己的系统架构是什么!!!不要急着去安装!!!

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包