统信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的特定最小子集。源码下载地址 gitcode地址:linuxdeployqt编译(统信UOS系统)步骤一:下载解压 步骤二:修改源码,去掉gcc版本检查 找到main.cpp源码,将这一段(在192行左右)注释掉(这里通过看源码,实际上是可以通过配置去控制的(研究源码发现的,但是我们不再动作了,只是贴出来): 还是老方法继续修改:vilinuxdeployqt-master/tools/linuxdeployqt/main.cpp 步骤三:使用cmake配置cdlinuxdeployqt-mastercmakeCMakeLists.txt 因为安装了git与这个工程可能不对,我们直接使用源码修改,直接定位到代码给删掉:viCMakeList.txt 直接删掉目录下的缓存文件:CMakeCache.txt,然后继续: 继续cmake CMakeList.txt步骤四:配置Qt的依赖环境 麒麟系统本身自带了qt5库(未带开发相关的库),而我们使用了另外安装的qt5,所以依赖需要引入我们自己安装的qt5上。 为了方便配置,也不影响系统我们装上cmake的gui版本:sudoyuminstallcmake-gui cmake-gui 选择对应的路径,然后使用默认unix makefile方式配置: 步骤五:生成generate 步骤六:编译make 切入build目录,并且使用make命令即可:make 测试程序: 步骤七:安装到系统目录 没有make install这个,手动移动到/usr/local/binsudocptools/linuxdeployqt/linuxdeployqt/usr/local/bin/ 步骤八:测试是否编译成功 linuxdeployqt打包流程(arm看可以,本次pc版本失败) (PS:虚拟机打包好之后,退回到裸机版本,再测试) 新建一个工程 然后,找个空目录: 未打包在开发机上也可以运行(裸机不行): 这里要将Qt引入环境,为了不影响系统,使用source脚本引入,每次使用之前使用source env.sh引入即可。touchenv.sh 然后输入如下(QT_DIR为安装Qt的路径):#!/bin/shQT_DIR=/home/yang/Qt5.12.8/5.12.8/gcc_64exportPATH=${QT_DIR}/bin:$PATHexportLIB_PATH=${QT_DIR}/lib:$LIB_PATHexportPLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATHexportQML2_PATH=${QT_DIR}/qml:$QML2_PATHexportLD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATHecho$PATHecho$LIB_PATHecho$PLUGIN_PATHecho$QML2_PATHecho$LD_LIBRARY_PATH 引入环境: 下次打包遵循此流程即可,继续打包: (PS:这里是没有使用sudo进行的打包的,可能对权限管控比较严格,查看“入坑二”) 下面使用sudo打包:sudolinuxdeployqttestDemo-verbose2 上面是Qt5Widget的库连接到系统库上去了,版本不一样找不到api 下面是未打包的testDemo在开发机上: 下面是未打包的testDemo在裸机上: 手动来实现linuxdeployqt打包步骤一:应用放过去 (这是开发机,直接运行也是可以的) 步骤二:创建qt.conf 这个文件最重要,他就是调用testDemo应用时候,先加载然后去搜索库路径的配置,没有他则走向系统环境变量了。touchqt.confviqt.conf 内容,是我们从另外国产麒麟打包的该文件复制的,如下: #Generatedbylinuxdeployqt#[Paths]Prefix=./Plugins=pluginsImports=qmlQml2Imports=qml 这个时候,我们再运行一次: 路径从本地开始找了。步骤三:实现其他三个文件夹依赖的拷贝 ls-lcp/home/yang/Qt5.12.8/5.12.8/gcc_64/translations/.-rfcp/home/yang/Qt5.12.8/5.12.8/gcc_64/plugins/.-rfcp/home/yang/Qt5.12.8/5.12.8/gcc_64/lib/.-rfls-lh 测试本机可运行了: (PS:这里是全部copy了库,没有进行依赖裁剪的,暂时不管了,花费时间远超预期了)步骤四:打包放到裸机上 因为没有裁剪,所以包比较大:cd..tarcvfoutManual.taroutManualls-loutManual.tar 拷贝到裸机上去。 步骤五:裸机上测试运行(失败) 还是失败,如下: 这还是之前一样,libQt5Widget.so.5依赖libQt5Core.so.5,前面是用当前配置的,然后库的依赖库就强制引入到了/usr/lib64,跟之前linuxdeployqt打包一样的问题。 然后有个念头,于是尝试加上LD_LIBRARY_PATH测试,可以运行成功,具体查看“入坑四”。步骤六:编译时引入运行时路径pro配置QMAKE_RPATHDIR 为了不在运行时额外添加环境变量,为了打包不出现xcb问题,还得修改一下.pro文件如下图:#这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATHQMAKE_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*删除,首先检查系统是否正常启用,再打包尝试。sudorm/usr/lib64/libQt5* 重启,确实,系统起不来了,系统依赖Qt5.11下的库。 所以不能删除,此路不通。尝试2 拍快照,然后将安装的Qt5库copy过去,首先检查系统是否正常启用,再打包尝试。 执行copy指令,直接立即黑屏,此路不同。 所以,/usr/lib64下的库是不能动的。 这里怀疑,从进入终端开始就进入了固定的优先环境变量,只是推测,目前linuxdeployqt又花费半天,暂时仍然无解。解决方法(有点偏门,失败) 找不到一个库就删掉一个库,此时系统是已经将库加载进内存运行,是不影响正在运行的系统,但是无法重启,如下:sudolinuxdeployqttestDemo-verbose2sudorm/usr/lib64/libQt5Gui.so* sudolinuxdeployqttestDemo-verbose2sudorm/usr/lib64/libQt5Core.so* sudolinuxdeployqttestDemo-verbose2sudocp/home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicuuc.so*/usr/lib64/ sudolinuxdeployqttestDemo-verbose2sudocp/home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicudata.so*/usr/lib64/ sudolinuxdeployqttestDemo-verbose2sudoyuminstallpatchelfsudolinuxdeployqttestDemo-verbose2 可以,uos你赢了,我放弃了!!!入坑四:手动qt.conf模仿部署还是强制路径切换问题 原因 分析该系统第二次搜索库,总是会引入到/usr/lib64,这个问题很操蛋,从一开始linuxdeployqt打包不行就是这个根本原因。解决 直接在编译的时候,最优先的方式,让应用去运行时先依赖相对路径,而不是去依靠运行时的环境变量和配置文件了。 pro加入配置文件:#这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATHQMAKE_RPATHDIR=./lib 点击应用运气的时候,应用自身会先依赖./lib下的库查找。
发表回复