linux下Qt程序deb打包,Ubuntu1604打包QT的程序

Ubuntu下打包QT的程序是比较难受的,没有一键打包的软件,经常会出现段错误或找不到库,核心思想就是找依赖库,将所有依赖库都拷贝出来。但一个依赖库又依赖另一个,往往找不全。

像这样,段错误连提示都没有

396e47f935da2964da8993fa2feea8f9.png

像这样:

fe80bced95e799e154bf7047adcd7183.png

像这样

4fa1d2a0cf33aad03593b2ae4742f431.png

像这样

a3f5069799d51d244c0ef3e85a85ab41.png

QT编译程序时使用release,并勾上shadow build

81cc0eaa26e606de46779d38199a8cd4.png

方法一:基于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

646ecc93171bf4830e70a49c75daad0c.png

我是下载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)

标签:QT,qt,Ubuntu1604,PATH,deb,cleanRobot,打包,linuxdeployqt

来源: https://www.cnblogs.com/jest549/p/14504766.html

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 dpkg 打包过程中,可以使用 preinst 和 postinst 脚本来处理安装失败的情况。 preinst 脚本在安装过程开始前运行,postinst 脚本在安装过程结束后运行。 要添加安装失败处理脚本,可以在这两个脚本中添加相应的代码。例如,可以在 preinst 脚本中检查是否存在某些条件,如果存在,则退出脚本并返回适当的错误代码。在 postinst 脚本中,可以检查安装过程是否成功,如果不成功,则执行相应的清理操作。 这些脚本可以使用任何合适的脚本语言编写,例如 bash、perl、python 等。 ### 回答2: 在dpkg打包中添加安装失败处理脚本,可以通过在debian的control文件中添加一个prerm脚本来实现。 首先,在打包的文件夹中找到debian文件夹,其中包含了打包所需的一些文件。在debian文件夹中创建一个新的文件,命名为prerm,没有文件后缀。这个文件将会是我们的安装失败处理脚本。 在prerm脚本中,我们可以添加一些处理逻辑来处理安装失败的情况。比如,我们可以在脚本中加入一些命令来记录错误日志、清理残留文件等。关于处理的具体逻辑,可以根据不同的需求来进行自定义。 保存并关闭prerm脚本,然后在debian文件夹中找到control文件,打开它。在该文件中找到Package这一行,下面是该软件包的其他信息。在这些信息后面添加一个新的行,格式为prerm {文件名}。其中,{文件名}应该是刚刚创建的prerm脚本的文件名。 保存并关闭control文件,之后可以使用dpkg命令进行软件包的打包和安装。在安装过程中,如果出现安装失败的情况,dpkg会调用prerm脚本进行处理,执行预先设定的命令逻辑。 通过添加安装失败处理脚本,可以对安装过程中出现的问题进行处理,提高软件包的可靠性和用户体验。 ### 回答3: 在dpkg打包时,可以通过添加安装失败处理脚本来处理安装失败的情况。这样可以在安装过程中出现问题时,自动执行指定脚本来进行处理,以确保安装过程的完整性。 添加安装失败处理脚本的步骤如下: 1. 创建一个脚本文件,命名为"postinst",这个脚本文件将在安装失败时执行。 2. 在脚本文件中,可以编写处理安装失败情况的代码。例如,可以通过备份文件、回滚配置或执行其他必要的操作来处理安装失败的情况。根据具体需求,可以自定义脚本内容。 3. 将脚本文件添加到dpkg打包的控制文件中的"postinst"字段中。这样,在安装过程中,当出现安装失败的情况时,脚本文件将会被调用并执行。 4. 打包完成后,使用dpkg工具安装软件包。当安装过程中出现问题时,脚本文件将会自动执行,并按照脚本中定义的逻辑进行处理。 通过添加安装失败处理脚本,可以在软件包安装失败时提供一个处理机制,确保系统的稳定性和安全性。这样,就可以及时发现和处理软件包安装时可能出现的问题,避免潜在的安全漏洞和系统故障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值