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