Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
前言
之前在ubuntu上发布qt程序相对还好,使用脚本,在麒麟上发布的时候,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。
本篇文章依然是继续发布主题,有centOS的qt项目需要发布,系统是CentOS8.2,同时也做了CentOS7.5的发布(CentOS7.5整体差上不差,就是需要先yum卸载自带的cmake,然后源码安装cmake3.4)
相关博客
《Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败) 》:在ubuntu上发布程序遇到xcb问题,当我们将其部署到另外同样环境但是未装qt的环境下,运行起来一部分是xcb文件,有一部分解决后可以正常运行启用,另一部分直接段错误,程序宕掉(提示,段核心错误,已转存什么的),使用linuxdeployqt能解决此问题,也就是使用脚本打包的升级版本。
《麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序》:这是在麒麟上使用linuxdeployqt打包的全流程。
《Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序》:这是在CentOS界面服务器上linuxdeployq打包的流程。
linuxdeployqt
Linux部署工具linuxdeployqt将应用程序作为输入,并通过将应用程序使用的资源(如库、图形和插件)复制到一个包中使其自包含。结果包可以作为AppDir或AppImage分发给用户,也可以放入交叉分发包中。它可以作为构建过程的一部分,在CMake、qmake和make等系统中部署用C、C++和其他编译语言编写的应用程序。当用于基于Qt的应用程序时,它可以绑定运行应用程序所需的Qt的特定最小子集。
源码下载地址
gitcode下载:https://gitcode.net/mirrors/probonopd/linuxdeployqt
百度网盘下载:https://pan.baidu.com/s/1mS7bWqg8UQkfTx-5SNVGuw?pwd=1234
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:

安装make install:

测试:

步骤五:使用cmake配置
cmake CMakeList.txt

因为安装了git与这个工程可能不对,我们直接使用源码修改大法,直接定位到代码给删掉:
gedit CMakeLists.txt
第7行至63行删除:


直接删掉目录下的缓存文件:CMakeCache.txt,然后继续:
rm CMakeCache.txt
步骤六:配置Qt的依赖环境
系统qt5:

而我们使用了另外安装的qt5,所以依赖需要引入我们自己安装的qt5上。
使用cmake-gui来指定依赖的qt:
cmake-gui
选择对应的路径,然后使用默认unix makefile方式配置:

点击“Configure”,选择“Unix Makefiles”方式:

这里默认使用了系统的:

虽然系统的和我们安装的是一样的还是为了不出错需要配置以下:

再配置一次:

步骤七:生成generate

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

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

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

linuxdeployqt打包流程
步骤一:准备打包的应用可执行程序和空目录
新建一个工程

然后找个空目录:

copy程序:

步骤二:引入环境变量
qmake要引入$PATH中(注意:不指定则当前使用的是系统的qmake):
为了不影响系统,使用脚本引入,每次打包使用之前使用source env.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打包拷贝进去:

入坑
入坑一:coro dump缺少libxcb-icccm.so.4库
问题
为了进一步验证,我们弄一个全新的CentOS8.2做测试,裸镜像:

之前的app打包拷贝进去:

跑不起来:


原理
毫无疑问,应该xcb依赖的一些库没有导入进来:
export QT_DEBUG_PLUGINS=1

解决
使用linuxdeployqt的时候,使用-appimage

Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序的更多相关文章
- Qt实用技巧:使用QTableView、QSqlTableMode与QSqlDatabase对数据库数据进行操作
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78615800 Qt实用技巧:使用QTableView.QSqlTableMode与Q ...
- Qt ------ linux(ubuntu) 下用 linuxdeployqt 打包发布程序
https://github.com/probonopd/linuxdeployqt/releases 1.下载linuxdeployqt 2.把下载的文件放入 /usr/local/bin 内,并执 ...
- Qt技巧:Win7下打包发布Qt程序(解释的比较清楚,把exe和dll伪装合并成一个文件)
转自:http://www.stardrad.com/blog/qt-5%E7%A8%8B%E5%BA%8F%E5%9C%A8windows%E4%B8%8A%E7%9A%84%E5%8F%91%E5 ...
- 在QT C++中调用 Python并将软件打包发布(裸机可运行)
为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...
- 打包发布 Qt Quick/Widgets 程序
使用的QT自带的部署工具(windeployqt.exe,路径QT安装路径),版本替换debug/release Qt Quick "C:\Qt\Qt5.8.0\5.8\mingw53_32 ...
- 高质量PHP代码的50个实用技巧必备(上)
1.不要使用相对路径 常常会看到: ? 1 require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. ...
- Qt实用技巧:界面切换使用Dialog全屏切换
需求 在做应用程序的过程中,需要使用界面切换,界面切换到下一个界面使用new一个界面并显示,如系统设置,相关信息展示等等. (注意:本技巧适用的条件是,主界面不需要相关的信号与槽做消息循环,因为主界面 ...
- QT小技巧(书上没有的)
1. Layout本身不能控制隐藏和显示,但是可以在外面专门套一个Widget,然后控制这个Widget就可以达到相应的效果了. 2. 空目录居然也存在 if (QDir(""). ...
- 记录.NET Core在CentOS上基于Jenkins自动化发布
1.安装Jenkins,我这里采用的是非docker方式安装(两种都行,任选一种) 参考:https://www.cnblogs.com/xiaxiaolu/p/10357806.html https ...
- 微信小程序代码上传,审核发布小程序
1.打开微信开发者工具 管理员扫码 -> 填写好小程序的项目目录.AppID(必须是客户已注册好的AppID).项目名称 2.在app.js中修改id(客户登录后台管理系统的id),app.js ...
随机推荐
- 「NOTE」常系数齐次线性递推
要不是考到了,我还没发现这玩意我不是很会-- # 前置 多项式取模: 矩阵快速幂. # 常系数齐次线性递推 描述的是这么一个问题,给定数列 \(c_1,c_2,\dots,c_k\) 以及数列 \(f ...
- WSL2与ensp的40故障
在使用ensp做radius认证的时候看到了Linux平台的freeradius认证服务器,于是使用了Windows平台的sub system: WSL2,按照网上的教程安装,并且安装了docker ...
- vmware workstation 16.x安装windows server 2012 R2无法点击安装vmware tools选项
在使用vmware workstation预设安装windows server 2012 R2后,提示需要先升级KBxxxxx更新才可以安装vmware tools,但是在安装了所需的更新后,发现菜单 ...
- 使用php为本地html文件生成url
1. 查看你是不是有php which php 2. 假设你的Demo.html 路径为 /Users/Sheron/Downloads/Demo.html cd /Users/Sheron/Dow ...
- limit资源限制ulimit 详解
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段.ulimit 是一种 L ...
- C#TimeSpan时间差转换成分钟和秒数
public Form1() { InitializeComponent(); aa = DateTime.Now.ToString(); } string aa; private void butt ...
- visio2019 破解
链接:https://pan.baidu.com/s/14AU8GFXhgjp87pK1bIK8UA?pwd=ju61 提取码:ju61 --来自百度网盘超级会员V5的分享 可能需要关闭防火墙和win ...
- PLC入门笔记5
定时器指令及其应用 定时器指令介绍 设备启动预热时间.化学反应时间.电机星三角转换时间? 我们需要定时器.PLC计时器指令由时间续电器演变而来. 定时器本质是一个输出指令. 主要功能是,当输入端有能流 ...
- clamav测试用例 API
最近接触到clamav这一块,本身是一个很简单的任务,只需要调用他的API对文件进行检测即可,但是在进行大量搜索发现,网上最多只有API的讲解,且质量层次不齐,这可为难住我了,作为一个名副其实的&qu ...
- 字符过滤流 对象流---->ObjectInputStream : 用法
1创建字输入节点流FileInputStram fis = new FileInputStream("读入的文件的路径");2创建对象输入过滤流 包装字节流ObjectInputS ...