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

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

时间:2023-06-27 11:32:38浏览次数:59  
标签:UOS qt 打包 sudo 编译 linuxdeployqt PATH 统信 usr

前言

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

<br>

注意

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

<br>

统信UOS系统版本

  系统版本:   在这里插入图片描述

<br>

linuxdeployqt

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

源码下载地址

  gitcode地址:https://gitcode.net/mirrors/probonopd/linuxdeployqt

<br>

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/

  在这里插入图片描述

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

  在这里插入图片描述

<br>

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在裸机上:   在这里插入图片描述

<br>

手动来实现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放置到原来的部署裸机上:   在这里插入图片描述   最终,直接点击可以运行成功。

<br>

入坑

入坑一:编译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,qt,打包,sudo,编译,linuxdeployqt,PATH,统信,usr
From: https://blog.51cto.com/hongpangzi/6561787

相关文章

  • QT实现参数批量配置
    QT实现批量配置需求一些参数需要批量化配置之前搭建的FPGA的寄存器控制模型使用AXI-lite搭建直接操作上位机这里需要一个可以快速配置所有参数的上位机需要保存文件,可以保留上一次的参数直接实现使用输入框复制,每个输入框配置一个下载按钮加载的时间很长,且实现繁......
  • ​​统信UOS服务器操作系统迁移docker目录​​
    原文链接:统信UOS服务器操作系统迁移docker目录hello,大家好啊,今天给大家带来一篇在统信UOS服务器操作系统上迁移docker目录的文章,在工作中我们会发现,当我们没有将/var目录单独分区的时候,运行docker容器后,会将根目录挤压,因此我们可以通过迁移docker目录的方式,释放根路径的磁盘空间,文......
  • QT样式表使用
    https://blog.csdn.net/qq_32348883/article/details/1226868321.前言QT使用样式表通常有三种方式:1.在UI设计器---QtDesigner内添加并设置样式;优点:直观显示。缺点:样式比较多时,不利于检查样式是否编写错误。同时不可以二次修改,即界面显示完毕后无法通过此方法修改界......
  • C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)
        园子里的有朋友在下载并了解了《C#实现Linux视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大......
  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • Qt/c++类型转换总结
    1、static_cast、dynamic_cast、强制转换(reinterpret_cast和const_cast)、qobject_cast、qstatic_cast以及qdynamic_cast的区别:static_cast:用于执行静态类型转换,可以进行常见的类型转换,例如基本类型之间的转换、向上转型、向下转型(但没有运行时类型检查)等。在C++中......
  • qt---多语言支持
    qt---多语言支持keywords:翻译多语言可以翻译的有2种:界面上的,默认都是会翻译的,如果不想翻译,可以取消勾选相应的"可翻译的"代码中出现的文本,如果需要翻译,可以用tr包裹,如:tr("hello")准备好之后,工具->外部->Qt语言家->更新翻译,这样就可以在相应的ts文件中生成待翻译......
  • “Terminate Server”; . setqt4env; ./helloQT4 -qws;
    [root@FriendlyARM/sdcard]#./helloQT4QWSDisplay::Data::init:InvalidargumentClientcan'tattachtomainrammemory.Aborted{退出Qtopia2.2.0或者Qt4程序等一切Qt程序,退出Qtopia2.2.0的方法是:在Qtopia2.2.0中点“设置”中的“关机”可出现如下界面,点......
  • 基于Python+QT5+Dialog开发的舆情可视化分析系统
    基于Python+QT5开发的舆情可视化分析系统项目介绍......
  • VSCode 配置 PyQt5 Designer
    安装扩展VSCode安装PYQTIntegration扩展。在线地址:VisualStudioMarketplace-PYQTIntegration。安装之后,点击扩展进行设置。设置扩展Pyuic找到pyuic路径,我的路径是:E:\DevTools\anaconda3\envs\pyqt5\Scripts\pyuic5。Qtdesigner找到Qtdesigner路径,我的路径......