提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Qt程序开发完了面临一个很重要的步骤,那就是如何打包发布。Windows上只要有Inno Setup、Qt Installer Framwork等;Linux主要有AppImage、Deb、Rpm等。今天这篇文章就来讲一讲,介绍下我常用的那些方法。
提示:方法很多,只列举一些
一、Windows
Windows相对于Linux来说不需要为了依赖问题而头疼,打包出来的程序几乎可以同时跑在7-11系统上,这个方法我以前介绍过了。可以看下这篇文章:
Windows上使用Inno Setup将应用程序打包成安装程序
二、Linux
Linux上的依赖比较头疼,至少比Windows难不少,Windows只要把dll和程序放同一个路径就可以了,程序运行的时候会自动加载,Linux有个查找机制:先LD_LIBRARY_PATH,再rpath,最后系统路径。所以就有个头疼的问题,不是所有的系统都有那个库,你的开发环境有不代表目标系统上也有。毕竟我们的目的是一次打包,处处运行。
注意:以下都是以Ubuntu-20.04系统版本为演示,不同系统可能不同
在此之前我们需要借助一个工具linuxdeployqt
,这个工具是所有的方法都要依赖的,它可以帮我们找到依赖资源,包括翻译,插件,库,图标等等。
wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
chmod a+x linuxdeployqt
sudo mv linuxdeployqt /usr/local/bin
1.tar&tar.gz
这个最简单,但是很low,不过能解决绝大多数的问题。可以将所有的依赖资源(包括动态库)打包到一个文件里分发到目标系统上再解压运行,如果你需要快捷方式就用建立一个Desktop Entity
就行了。使用方式:
首先:创建文件夹并复制可执行程序
#只是参考,可以是任何目录
mkdir myapp
cp <你的qt可执行文件> myapp
最后:执行linuxdeployqt复制依赖项
linuxdeployqt myapp/analogclock -qmake=/opt/Qt/5.15.2/gcc_64/bin/qmake -appimage
上面的那一步会把依赖项全部复制到myapp文件夹下面,不一定非得是myapp,随便什么名字都行,最好不要出现中文和空格。
这个时候你看到的应该是下面这样的:
ls myapp
AppRun analogclock analogclock.desktop analogclock.png doc lib plugins qt.conf translations
执行AppRun和analogclock 都可以启动程序。执行tar压缩即可开始分发,分发前测试下功能即可。
2.打包成.AppImage文件
还是要用到linuxdeployqt工具,只不过要多做一步才行。上面的命令如果不改成自己的desktop和图标,是不会一步打成AppImage文件的,要想打包成单文件必须改desktop和icon。
首先:创建文件夹并复制可执行程序,和上面一模一样
#只是参考,可以是任何目录
mkdir myapp
cp <你的qt可执行文件> myapp
其次:创建或修改desktop文件和复制自己的图标文件到myapp目录,desktop的名字和你的程序名字一样,icon的名字也和你程序名字一样
#analogclock.desktop
[Desktop Entry]
Type=Application
Name=analogclock
Exec=AppRun %F
Icon=analogclock
Comment=a clock
Categories=GNOME;GTK;Utility;
Terminal=true
最后:执行linuxdeployqt复制依赖项并打包成单文件
linuxdeployqt myapp/analogclock -qmake=/opt/Qt/5.15.2/gcc_64/bin/qmake -appimage
上面的那一步会把依赖项全部复制到myapp文件夹下面,不一定非得是myapp,随便什么名字都行,最好不要出现中文和空格。
生成analogclock-x86_64.AppImage
可执行文件。这个文件依赖libfuse2
这个库才能运行,所以这个方式并不是完美的,如果你能接受这个结果不妨试试。
./analogclock-x86_64.AppImage
2.打包成Deb或Rpm
暂时没时间研究,思路给到了,有时间再更新。
总结
1、第一种万金油,但是有点LOW
2、第二种稍微高大上一点,但是不完美