Debian_QT软件开发_QT程序打包

1 配置 linuxdeployqt 工具

1.1 下载linuxdeployqt

  • 下载linuxdeployqt,笔者下载的是linuxdeployqt-continuous-x86_64.AppImage
sudo mkdir -p /home/s/develop/0_tools/packages
cd /home/s/develop/0_tools/packages
sudo wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
  • linuxdeployqt-continuous-x86_64.AppImage重命名为linuxdeployqt
cd /home/s/develop/0_tools/packages
sudo cp linuxdeployqt-continuous-x86_64.AppImage ../linuxdeployqt
  • linuxdeployqt添加到环境变量中
sudo ehco "export PATH=/home/s/develop/0_tools:$PATH" > /etc/profile
sudo source /etc/profile
  • 通过linuxdeployqt --version验证是否可用。

1.2 配置linuxdeployqt所需的环境变量

  • 修改/etc/profile,在文件末尾添加以下内容(笔者的Qt安装在 "/home/s/Qt5.12.9"):
export PATH=/home/s/Qt5.12.9/5.12.9/gcc_64/bin:$PATH
export LIB_PATH=/home/s/Qt5.12.9/5.12.9/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/home/s/Qt5.12.9/5.12.9/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/home/s/Qt5.12.9/5.12.9/gcc_64/qml:$QML2_PATH
  • 重新生效配置
source /etc/profile

2 linuxdeployqt 打包Qt程序

笔者使用helloworld可执行文件作为例子。

  • 创建打包目录,笔者自定义为pack
sudo mkdir -p /home/s/develop/1_qt_project/hellowolrd/pack
  • 将可执行文件helloworld拷贝到pack目录下
sudo cp /home/s/develop/1_qt_project/hellowolrd/build/hellowolrd /home/s/develop/1_qt_project/hellowolrd/pack
  • 使用linuxdeployqt开始打包
cd /home/s/develop/1_qt_project/hellowolrd/pack
sudo linuxdeployqt hellowolrd -appimage
  • 如果有提示以下错误:
Categories entry not found in desktop file
.desktop file is missing a Categories= key

只需要在.desktop文件末尾添加Categories=Application;即可,然后重新打包就没问题了。

  • 打包完后,目录下大概有以下内容:

├── doc
│   ├── libc6
│   │   └── copyright
│   ├── libdbus-1-3
│   │   └── copyright
│   ├── liblzma5
│   │   └── copyright
│   ├── libpcre32-3
│   │   └── copyright
│   ├── libpulse0
│   │   └── copyright
│   └── libsystemd0
│       └── copyright
├── hellowolrd
├── lib
│   ├── libasyncns.so.0
│   ├── libavcodec.so.60
│   ├── libavformat.so.60
│   ├── libavutil.so.58
│   ├── libbsd.so.0
│   ├── libdbus-1.so.3
│   ├── libfdk-aac.so.1
│   ├── libFLAC.so.8
│   ├── libgcrypt.so.20
│   ├── libglib-2.0.so.0
│   ├── libglog.so.2
│   ├── libgthread-2.0.so.0
│   ├── libicudata.so.56
│   ├── libicui18n.so.56
│   ├── libicuuc.so.56
│   ├── libjsoncpp.so.25
│   ├── liblz4.so.1
│   ├── liblzma.so.5
│   ├── libnsl.so.1
│   ├── libnuma.so.1
│   ├── libogg.so.0
│   ├── libpcre.so.3
│   ├── libpng16.so.16
│   ├── libportaudio.so
│   ├── libpulsecommon-13.99.so
│   ├── libpulse.so.0
│   ├── libQt5Core.so.5
│   ├── libQt5DBus.so.5
│   ├── libQt5Gui.so.5
│   ├── libQt5Network.so.5
│   ├── libQt5Qml.so.5
│   ├── libQt5Quick.so.5
│   ├── libQt5Svg.so.5
│   ├── libQt5VirtualKeyboard.so.5
│   ├── libQt5WebSockets.so.5
│   ├── libQt5Widgets.so.5
│   ├── libQt5XcbQpa.so.5
│   ├── libsndfile.so.1
│   ├── libswresample.so.4
│   ├── libsystemd.so.0
│   ├── libvorbisenc.so.2
│   ├── libvorbis.so.0
│   ├── libwrap.so.0
│   ├── libx264.so.155
│   ├── libx265.so.179
│   ├── libXau.so.6
│   ├── libxcb-glx.so.0
│   ├── libxcb-xfixes.so.0
│   ├── libxcb-xkb.so.1
│   ├── libXdmcp.so.6
│   ├── libXext.so.6
│   ├── libxkbcommon.so.0
│   ├── libxkbcommon-x11.so.0
│   └── libXrender.so.1
├── plugins
│   ├── bearer
│   │   ├── libqconnmanbearer.so
│   │   ├── libqgenericbearer.so
│   │   └── libqnmbearer.so
│   ├── iconengines
│   │   └── libqsvgicon.so
│   ├── imageformats
│   │   ├── libqgif.so
│   │   ├── libqicns.so
│   │   ├── libqico.so
│   │   ├── libqjpeg.so
│   │   ├── libqsvg.so
│   │   ├── libqtga.so
│   │   ├── libqtiff.so
│   │   ├── libqwbmp.so
│   │   └── libqwebp.so
│   ├── platforminputcontexts
│   │   ├── libcomposeplatforminputcontextplugin.so
│   │   ├── libibusplatforminputcontextplugin.so
│   │   └── libqtvirtualkeyboardplugin.so
│   ├── platforms
│   │   └── libqxcb.so
│   └── xcbglintegrations
│       ├── libqxcb-egl-integration.so
│       └── libqxcb-glx-integration.so
├── qt.conf
└── translations
    ├── qt_ar.qm
    ├── qt_bg.qm
    ├── qt_ca.qm
    ├── qt_cs.qm
    ├── qt_da.qm
    ├── qt_de.qm
    ├── qt_en.qm
    ├── qt_es.qm
    ├── qt_fi.qm
    ├── qt_fr.qm
    ├── qt_gd.qm
    ├── qt_he.qm
    ├── qt_hu.qm
    ├── qt_it.qm
    ├── qt_ja.qm
    ├── qt_ko.qm
    ├── qt_lv.qm
    ├── qt_pl.qm
    ├── qt_ru.qm
    ├── qt_sk.qm
    ├── qt_uk.qm
    └── qt_zh_TW.qm

3 启动脚本

在第2节中,我们成功的打包了hellowolrd依赖的文件。有没有想过,我们现在的机器是开发环境的机器,而不是客户使用的机器,如果我们的软件安装在了客户的机器是不是一定能运行起来呢?我们看目录下的lib,发现有好多动态库文件,也就是说我们的可执行文件依赖lib里面的内容。但我们的lib并不放在系统库目录下的。因此,我们需要通过一个脚本来启动我们的程序。

hellowolrd.bash内容如下:

#!/bin/sh
HERE="$(dirname "$(readlink -f "${0}")")"
export LD_LIBRARY_PATH="${HERE}"/lib
export QT_PLUGIN_PATH="${HERE}"/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH="${HERE}"/plugins/platforms
exec "${HERE}"/hellowolrd 

我们还需要给这个脚本文件赋予执行权限:

sudo chmod +x helloworld.bash

参考

  1. 【教程】linux与windows环境下qt程序打包教程

  2. Linux下QT程序打包

  3. linux下的Qt程序打包脚本(能避免各种问题),网上的脚本打包失败常见原因分析和雷区

  4. Linux 环境打包 QT 程序

  5. 免安装git麒麟系统上使用linuxdeployqt 编译安装

  6. DEB打包流程—新手入门(附自动化打包shell源码)

  7. 【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】