序言
之前在ubuntu上发布qt程序相对还好,使用脚本,在麒麟上发布的时侯,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的疗效,使用linuxdeployqt发布qt程序。
本篇文章仍然是继续发布主题,有centOS的qt项目须要发布,系统是CentOS8.2,同时也做了CentOS7.5的发布(CentOS7.5整体差上不差,就是须要先yum卸载自带的cmake,之后源码安装cmake3.4)
相关博客
《Qt实用方法:ubuntu发布程序打包流程(解决插件xcb加载失败)》:在ubuntu上发布程序遇见xcb问题linux删除文件夹,当我们将其布署到另外同样环境并且未装qt的环境下,运行上去一部份是xcb文件,有一部份解决后可以正常运行启用,另一部份直接段错误linux qt程序打包发布linux环境变量,程序宕掉(提示,段核心错误,已转存哪些的),使用linuxdeployqt能解决此问题,也就是使用脚本打包的升级版本。
《麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序》:这是在麒麟上使用linuxdeployqt打包的全流程。
《Qt实用方法:在CentOS上使用linuxdeployqt打包发布qt程序》:这是在CentOS界面服务器上linuxdeployq打包的流程。
linuxdeployqt
Linux布署工具linuxdeployqt将应用程序作为输入,并通过将应用程序使用的资源(如库、图形和插件)复制到一个包中使其自包含。结果包可以作为AppDir或AppImage分发给用户,也可以倒入交叉分发包中。它可以作为建立过程的一部份,在CMake、qmake和make等系统中布署用C、C++和其他编译语言编撰的应用程序。当用于基于Qt的应用程序时,它可以绑定运行应用程序所需的Qt的特定最小子集。
源码下载地址
gitcode下载:
linuxdeployqt编译(CentOS系统)步骤一:下载解压
步骤二:更改源码,除去版本检测
找到main.cpp源码,将这一段(在192行左右)注释掉:
cd linuxdeployqt-master gedit tools/linuxdeployqt/main.cpp
步骤三:安装三方依赖库CMake
centOS安装软件先切换至root:
su root
CMake是自带了(注意:本篇是centOS8.2,而在centOS7.5上,由于cmake自带为cmake2.8,后续论证了,是须要卸载cmake2.8,源码装cmake3.20也编译错误,之后卸载又源码安装了cmake3.4,在centOS7.5上后续才顺利make编译linuxdeployqt)
使用到了cmake-gui
yum install cmake-gui.x86_64
步骤四:从源码安装patchelf工具(比其他系统多下来的)
由于yum没有,也没有找到安装方式,只能从源码编译安装了。
下载地址;
wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz
解压:
tar xvf patchelf-0.9.tar.gz
步入文件夹,配置configure:
cd patchelf-0.9 ./configure
编译make:
安装makeinstall:
测试:
步骤五:使用cmake配置
cmake CMakeList.txt
由于安装了git与这个工程可能不对,我们直接使用源码更改大法,直接定位到代码给删除:
gedit CMakeLists.txt
第7行至63行删掉:
直接删除目录下的缓存文件:CMakeCache.txt,之后继续:
rm CMakeCache.txt
步骤六:配置Qt的依赖环境
系统qt5:
而我们使用了另外安装的qt5,所以依赖须要引入我们自己安装的qt5上。
使用cmake-gui来指定依赖的qt:
cmake-gui
选择对应的路径,之后使用默认unixmakefile形式配置:
点击“Configure”,选择“UnixMakefiles”方式:
这儿默认使用了系统的:
尽管系统的和我们安装的是一样的还是为了不出错须要配置以下:
再配置一次:
步骤七:生成generate
步骤八:编译make
切入build目录,但是使用make命令即可:
cd build make
步骤九:安装到系统目录
没有makeinstall这个,自动联通到/usr/local/bin
cp linuxdeployqt /usr/local/bin/
步骤十:测试是否编译成功
linuxdeployqt打包流程步骤一:打算打包的应用可执行程序和空目录
新建一个工程
之后找个空目录:
copy程序:
步骤二:引入环境变量
qmake要引入$PATH中(注意:不指定则当前使用的是系统的qmake):
为了不影响系统,使用脚本引入linux qt程序打包发布,每次打包使用之前使用sourceenv.sh引入即可。
#!/bin/sh QT_DIR=/home/yang/Qt/5.15.2/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
步骤三:打包
继续打包:
// 打包命令(用这条还是非常可能缺库,如libxcb.icccm.so.4各种系统库) // linuxdeployqt 可执行程序 -verbose2(不要用这条了,之前ubuntu和麒麟都没出现该问题,但是centOS8.2出现了却库的问题) // 完整打包命令(完全带进去了) linuxdeployqt 可执行程序 -appimage
发觉早已打包成功,直接点击既可以运行了:
步骤四:论证
为了进一步验证,我们弄一个全新的CentOS8.2做测试,裸镜像:
之前的app3打包拷贝进去:
入坑入坑一:corodump缺乏libxcb-icccm.so.4库问题
为了进一步验证,我们弄一个全新的CentOS8.2做测试,裸镜像:
之前的app打包拷贝进去:
跑不上去:
原理
毫无疑惑,应当xcb依赖的一些库没有导出进来:
export QT_DEBUG_PLUGINS=1
解决
使用linuxdeployqt的时侯,使用-appimage