writer:lIcht email:lIcht.gzl@gmail.com date: 2020.8.3
Qt开发软件通常最后阶段要打包发布,Linux下Deb包是用户安装很方便的方式,以程序名为QCommander,以此为例,中间也因为一下小问题卡住了一周左右,主要是没找到解决的关键点。如打包后双击程序启动加厚找不到ROS的环境变量导致程序闪退的问题,无意之间看到一个帖子在设置qtcreator.desktop文件时的Exec绝对路径之前加上了bash -i -c语句,加载了终端的环境变量,试了试便成功了,以下对整个过程进行回顾记录。
1、安装linuxdeployqt,两种方式:
a)直接下载下图中的linuxdeployqt-7-x86_64.AppImage文件
github地址:https://github.com/probonopd/linuxdeployqt/releases
可将直接将.AppImage文件下载完成后,将其改名为linuxdeployqt,并chmod+x,复制到/usr/local/bin/下,然后命令行输入linuxdeployqt -version,若输出版本信息表示安装成功。
如果是ubuntu18以上的系统版本可能会出现报错:
b)此时应采用源码编译方式:
github地址:https://github.com/probonopd/Linuxdeployqt.git
下载后编译之前将tools/Linuxdeployqt/main.cpp中的下述代码注释掉:
xxxxxxxxxx
// openSUSE Leap 15.0 uses glibc 2.26 and is used on OBS
/*if (strverscmp (glcv, "2.27") >= 0) { //注释版本检查
qInfo() << "ERROR: The host system is too new.";
qInfo() << "Please run on a system with a glibc version no newer than what comes with the oldest";
qInfo() << "currently still-supported mainstream distribution (xenial), which is glibc 2.23.";
qInfo() << "This is so that the resulting bundle will work on most still-supported Linux distributions.";
qInfo() << "For more information, please see";
qInfo() << "https://github.com/probonopd/Linuxdeployqt/issues/340";
return 1;
}*/
然后就可以使用cmake和make进行编译,生成好的可执行程序是tools/Linuxdeployqt/Linuxdeployqt,同样将其拷贝到/usr/local/bin/目录,使用linuxdeployqt -version命令查看是否安装成功。
2、安装patchelf工具:
xxxxxxxxxx
sudo apt-get install patchelf
3、打包应用程序
a)在qt中将程序编译成Release版本:
注意在程序.pro文件中添加如下代码:
xxxxxxxxxx
TARGET = QCommander
TEMPLATE = app
QMAKE_LFLAGS += -no-pie
编译通过后确保release中成的可执行文件类型为:
任意位置创建一个文件夹,名称为应用程序的名称(这里为QCommander),然后将release版本中的可执行文件(单个文件就行了)复制到此文件夹下:
在当前QCommander目录下打开终端,使用linuxdeployqt对其进行打包,命令如下:
xxxxxxxxxx
linuxdeployqt APPname -appimage
本例为:linuxdeployqt QCommander -appimage
过程出现的如下报错信息不予处理,完成后效果:
此时目录下自动生成了一系列文件:
此时可双击或者在命令行./APPname可执行程序,验证能不能运行。
接下来拷贝进一个图标文件作为该程序的图标,本例为Tank128.png,并将default.desktop文件改名为QCommander.desktop:
4、生成deb包
在任意位置新建一个文件夹,名为QCommanderdeb,或任意名字,进入该文件夹新建两个文件夹:source、output :
进入source文件夹新建文件: DEBIAN、opt,将QCommander文件夹复制到opt目录下:
打开QCommander.desktop文件,修改内容:
xxxxxxxxxx
[Desktop Entry]
Version=1.0
Name=QCommander
Comment=this app use for zjy
Exec=bash -i -c /opt/QCommander/QCommander
Icon=/opt/QCommander/Tank128.png
Terminal=true
Type=Application
Categories=Application;
Name[en_US]=QCommander.desktop
#以下内容不要复制
#Version为版本号
#Name为程序名
#Comment为描述内容
#Exec为可执行程序绝对路径(此处加上bash -i -c是为了在程序启动是加载终端的中的环境变量,可选择不加)。
#Icon为图标文件绝对路径
#Terminal为是否运行时打开终端显示信息
#Type为程序的类型
#Categories为分类
在DEBIAN目录下新建三个文件: control、postinst、postrm
control文件中的内容:
xxxxxxxxxx
Package: QCommander
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends:
Installed-Size: 512
Maintainer: 123@163.com
Description: QCommander package
含义: Package:包名。 Version:应用版本。 Architecture:架构,我这里是amd64。 Maintainer:维护人员联系方式,看着办。 Description:软件包描述。 其他的,这里没用到,就不写了,自己百度吧。
postinst中的内容(安装时在菜单里生成该应用程序的图标):
xxxxxxxxxx
cp /opt/QCommander/QCommander.desktop /usr/share/applications/
cp /opt/QCommander/QCommander.desktop /root/Desktop/
postrm中的内容(卸载时移除菜单中该应用程序的图标):
xxxxxxxxxx
rm /usr/share/applications/QCommander.desktop
rm /root/Desktop/Qcommander.desktop
5、构建deb包
进入source文件夹下,在output文件夹中生成deb包:
xxxxxxxxxx
cd Desktop/QCommanderdeb/source
dpkg -b . /home/ubuntu/Desktop/QCommanderdeb/output/QCommander_amd64_0.1.0.deb
打包结果,双击即可安装: