Ubuntu下打包QT的程序是比较难受的,没有一键打包的软件,经常会出现段错误或找不到库,核心思想就是找依赖库,将所有依赖库都拷贝出来。但一个依赖库又依赖另一个,往往找不全。
像这样,段错误连提示都没有
像这样:
像这样
像这样
QT编译程序时使用release,并勾上shadow build
方法一:基于ldd命令,编写脚本复制依赖库(失败了)
patch.sh放入和将要打包的程序同级目录,将复制lib库
#!/bin/sh exe="appname" #你需要发布的程序名称 des="APPData" #步骤1中的目录即本文件所在目录 deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }') cp $deplist $des
执行脚本appname.sh(前缀和打包程序名名一致),用于命令行运行
#!/bin/sh appname=`basename $0 | sed s,\.sh$,,` dirname=`dirname $0` tmp="${dirname#?}" if [ "${dirname%$tmp}" != "/" ]; then dirname=$PWD/$dirname fi LD_LIBRARY_PATH=$dirname export LD_LIBRARY_PATH $dirname/$appname "$@"
一顿操作,放到没有装qt的ubuntu下还是缺库,有报找不到的xcb什么的,有报nss什么的,有报依赖库找不到什么字符定义的。然后我千辛万苦找齐库和源码编译这些库,放入应用程序同级目录,执行,直接什么提示都没有,就一行段错误。用这种方法打包好的欢迎告诉我
方法二:使用linuxdeployqt(成功了)
在github下载:https://github.com/probonopd/linuxdeployqt/releases
我是下载source文件编译的,需要先安装patch,github地址:https://github.com/NixOS/patchelf/releases,按照说明可以安装好这两个工具
打包开始:
配置 qt 的环境变量 终端输入vim ~/.bashrc命令,修改 .bashrc 文件,在文件末尾追加以下内容,其中/home/zlkj/technology/5.9.7是我的Qt安装路径,大家要用自己的路径代替: #add QT ENV export PATH=/home/zlkj/technology/5.9.7/gcc_64/bin:$PATH export LD_LIBRARY_PATH=/home/zlkj/technology/5.9.7/gcc_64/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PATH=/home/zlkj/technology/5.9.7/gcc_64/plugins:$QT_PLUGIN_PATH export QML2_IMPORT_PATH=/home/zlkj/technology/5.9.7/gcc_64/qml:$QML2_IMPORT_PATH 最后要source一下使 ~/.bashrc 这个shell文件立即生效,而不必注销并重新登录。 $ source ~/.bashrc
执行:linuxdelpoyqt --version
#输出的版本信息 linuxdeployqt 5 (commit 37631e5), build 631 built on 2019-01-25 22:47:58 UTC
工具安装完成
打包应用程序
(1)运行Qt生成release版本的可执行文件,勾选了“shadow build”,所以示例用的是build-cleanRobot-Desktop_Qt_5_9_7_GCC_64bit-Release文件夹下的cleanRobot可执行文件;
(2)创建一个文件夹,名称最好是用可执行文件的名称,然后将cleanRobot可执行文件复制到此文件夹下;
(3)使用 linuxdeployqt 进行打包,一定要加上-appimage选项,命令如下:
$ linuxdeployqt appname -appimage
执行上面命令出现提示信息,不用管,只是创建了一个需要你自己编辑的desktop文件:
ERROR: Desktop file missing, creating a default one (you will probably want to edit it)
到这一步,就把可执行文件的动态库等依赖文件都复制到该文件夹中了
运行AppRun提示libsoftokn3.so没有,找到这个库,拷贝到和目标打包程序同目录的lib目录下,
提示nss什么错误,将 /usr/lib/x86_64-linux-gnu/nss 整个文件放入 项目的动态链接库中lib目录
然后就莫名其妙可以运行了,放在其他的没有装Qt的机器也可以,后面的步骤没有尝试了,能打包用就行
编写linux桌面图标启动(可选步骤)
修改qt 目录下的desktop文件。可以按照ubuntu 官方提示修改。
ubuntu desktop文件使用
#-- 全局安装(所有用户可用),将xxx.desktop 复制到/usr/share/applications
#-- 当前用户可用, 将xxx.desktop 复制到 ~/.local/share/applications 目录即可
#--appName.desktop
[Desktop Entry]
Version=1.0 #app的版本
Name=cleanRobot #app的名字
Comment= this app use for xxx #说明信息
Exec=/path/to/your/QtApp/cleanRobot #app的执行路径,绝对路径
Icon=/path/to/your/app_icon/cleanRobot.ico #icon 路径,绝对路径
Terminal=false #是否在终端启动,效果自己试一下就知道了
Type=Application
Categories=Utility;Application;
编写开机脚本 runApp.sh
执行以下命令,创建runApp.sh:
$ vim runApp.sh
写入以下内容:
#!/bin/bash
export LD_LIBRARY_PATH=/app/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/app/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/app/qml:$QML2_IMPORT_PATH
./cleanRobot
再给运行开机脚本runApp.sh添加可执行权限:
$ chmod +x runApp.sh
此时运行开机脚本,则可启动程序。其实到这一步就可以发布了,压缩成一个压缩包发布即可,可如果想继续打包成deb包,可以看下一步。
打包成deb包
deb是Debian Linux的软件包格式。一般来说是需要通过编译源码然后制作deb包,而这里是将前面生成的发布文件夹打包成deb包。步骤如下:
首先建立一个工作目录,比如在主文件夹下建立clean目录:
$ cd ~
$ mkdir clean
$ cd clean
因为安装软件包的时候默认是将文件释放到根目录下,所以我们这里设定安装路径为/usr/src:
$ mkdir -p usr/src #设定安装路径为/usr/src
$ cp -a ~/cleanRobot usr/src
$ mkdir DEBIAN
同时我们还需建立一个DEBIAN目录,用如下的方法在DEBIAN目录下创建一个control文件,并加入以下内容:
package: cleanRobot
Version: 1.0.1
Section: utils
Priority: optional
Architecture: i386
Depends:
Installed-Size: 512
Maintainer: fengMisaka
Description: cleanRobot-deb
然后就可以使用dpkg命令构建deb包了,生成的包在/home目录下:
$ dpkg -b . /home/cleanRobot_1.0.1_i386.deb
安装deb包命令如下:
$ sudo dpkg -i soft_1.0.1_i386.deb
就可以看到/usr/src多出了个cleanRobot目录,至此大功告成,运行开机脚本即可。
扩展
1、关于qt.conf
这个文件指定了qt 程序的运行环境,即我们可以使用qt.conf 指定qt程序的运行路径和库路径。内容如下所示:
# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./ #程序的运行路径
Libraries = ./lib #程序的库路径
Plugins = plugins #插件路径
Imports = qml
Qml2Imports = qml
**参考:** [使用linuxdeployqt,在linux下发布qt](https://blog.csdn.net/WMX843230304WMX/article/details/78748835)
**参考:** [使用linuxdeployqt,在linux下发布qt](https://blog.csdn.net/WMX843230304WMX/article/details/78748835)
**参考:** [使用linuxdeployqt,在linux下发布qt](https://www.cnblogs.com/linuxAndMcu/p/11016322.html)
在linux下使用linuxdeployqt发布Qt程序
Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)