Qt应用程序在windows和Linux操作系统下的打包发布(超详细,超清晰全面,图文并茂)

1.简介

在对Qt应用程序的打包发布的时候,经过多方查阅资料和自身实践,本文将总结Qt程序在不同操作系统下的打包发布问题

2.windows下的打包

1)发布环境

  • win10专业版
  • QT5.11
  • Qt Creator4.7.1
  • MinGw5.3.0 32bit

2)方法一 – release版本发布

通过这个方式发布的Qt应用程序将会把可执行应用程序.exe和它所依赖的动态链接库一同拉取到一个文件夹中,将此文件夹拷贝到客户机上(无Qt开发环境也可)打开可执行应用程序即可运行。不过这样发布的缺点就是发布文件太大了。

a) release要发布程序

首先需要在Qt Creator下,通过release方式运行想要发布的程序
在这里插入图片描述
之后,在项目的存放目录下,找到release版本的影子文件夹
在这里插入图片描述
进入文件夹之后发布程序的.exe可执行文件,将其拷贝到一个好找的地方如桌面,以我这里为例,将其拷贝到桌面新建的一个叫Chat的文件夹
在这里插入图片描述在这里插入图片描述
如果这个时候双击打开的话,就会提示缺少一系列的动态链接库,如果一个个的补全这些库的话,很麻烦也懒得找。所以需要将其打包

b) 通过windeployqt打包

如果使用的是MinGw的编译环境,那么,我们就会在应用程序里面找到一个叫Qt5.11.2 for Desktop的命令行工具

在这里插入图片描述

将其双击打开进入桌面那个存放可执行文件的Chat文件夹,使用Qt自带的打包工具windeployqt命令打包动态链接库到此文件夹

在这里插入图片描述
打包成功后,就会发现之前在桌面创建的那个文件夹里面自动包含了程序需要的动态链接库和环境配置等

在这里插入图片描述
这时候在此文件夹中可以双击打开这个应用并且成功打开,就可以将整个文件夹打包发给没有开发环境的客户机了
在这里插入图片描述

3)方法二 – 发布成独立的可执行exe文件

前面我们提到过,通过Qt自带的windeployqt方式发布的程序,文件包很大,一班都有好几十兆,不利于迁移,所以我们还可以利用其他打包工具,将动态链接库集成一下

a) 下载工具

这里我们用到的工具叫 Enigma Virtual Box,这是一个集成式的打包软件,软件本身并没有多大,只有几兆大小,但麻雀虽小五脏俱全,该有的发布功能都有,并且操作见到,到官网下载

在这里插入图片描述

b) 打包

需要注意的是,这第二种打包方式是建立在第一种打包方式通过windeployqt的打包方式之上的,需要第一步的打包文件夹。所以第一种打包方式是基础

人们常说no picture say jb,所以下面是详细图片的记录,打开Enigma Virtual Box软件操作如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置完成之后,运行如下
在这里插入图片描述
这时候在新的文件夹中就会发现只有一个打包好的独立可执行文件,双击就可打开

在这里插入图片描述

使用这种方式打包的应用程序比前者小了很多,并且是独立的可执行文件,可以直接打开,方便了许多

4)方法三 – 打包成安装包发布

如果是想打包成桌面软件安装包的形式那种,也是需要打包工具来实现,因为博主暂时没有这方面的需求,但是也给出两种解决方式

a)通过Inno Setup工具打包

Inno Setup是一种专门应用于应用程序安装包打包的工具,可以自行定义发布者的信息和版本信息等,具体方式可参考此篇博文,站在巨人的肩上

b)通过Advanced Installer工具打包

Advanced Installer也是一种强大的打包工具,发布定义方式众多,具体可参考这篇博文

3.Linux下的打包发布

1)发布环境

  • deepin15.11
  • Qt 5.10.1
  • Gcc 64bit

2)方法一 – 通过脚本打包

a)release编译可执行文件

在Linux中使用Qt以release的方式编译运行,然后将得到的可执行文件拷贝到一个新的地方,比如博主这里在桌面新建的一个叫pic的文件夹

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

b)编写脚本文件

使用命令进入可执行文件的目录下,然后新建两个shell脚本

  • pack.sh : 用于拷贝程序连接的动态库到要打包的文件夹中。命令编写如下

    • #!/bin/sh  
      exe="picClient" #需要发布的程序名称
      pwd="/home/ohuohuoo/Desktop/picClient" #创建文件夹的位置
      files=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
      cp $files $pwd
      
  • picClient.sh : 此脚本名必须和要打包发布的程序名字相同,我这里发布的名字为picClient,所以命名为picClient.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 "$@"
      

在这里插入图片描述

c)执行脚本

在这里插入图片描述
在这里插入图片描述

  • 需要注意的是,最后让程序运行的是脚本,所以我们直接运行picClient.sh这个脚本让的程序运行成功

d)解决xcb问题

使用上述的步骤打包的文件夹,将其压缩成解压包拷贝到目标用户机上运行,如果对方安装有Qt开发环境,那么就可以成功运行,但是如果对方没有,而且还是Ubuntu的操作系统的话,就会提示无法加载xcb插件的问题,一般这种问题就是缺少了两个动态库的依赖环境

  • libQt5XcbQpa.so.5
  • libQt5Dbus.so.5

这是两个链接,需要使用命令来查看Qt不同版本对应的这两个文件的实体文件(直接拷贝链接文件无效),进入Qt安装环境中下的lib库,一般是/Qt5.xx.x/xx.x/gcc_xx/lib这路径,进入后找到并复制到打包文件夹中
在这里插入图片描述
在这里插入图片描述

然后将找到的两个依赖库重命名为链接文件,方便脚本查找
在这里插入图片描述
在这里插入图片描述
然后再执行运行脚本,就不会出现xcb的报错问题,打包文件到此就可以拷贝到任意Linux客户机上成功运行了(😄)。

3)方法二 – 通过Linuxdeployqt部署打包

a)下载linuxdeployqt

windows下有Qt自带的打包工具windeployqt,而Linux下这样也有这样的部署工具,只不过这不是自带的,他在开源的GitHub上有编译好的程序文件,只需要进行调用即可linuxdeployqt下载
在这里插入图片描述
将其下载下来之后,赋予其可执行程序的权限,然后移动至/usr/local/bin/目录,通过重命名为linuxdeployqt,完成之后,可以输入linuxdeployqt -version查看版本信息,如果输出版本信息,则表示安装成功

在这里插入图片描述

b)配置Qt版本环境变量

打开终端,然后输入vim ~/.bashrc命令,然后在文件末尾追加以下关于Qt环境的内容,主要需要替换为自己的Qt安装路径

#添加Qt环境 -- 需要换成自己的Qt安装路径
export PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/bin:$PATH	
export LD_LIBRARY_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/qml:$QML2_IMPORT_PATH

然后执行source ~/.bashrc命令,使得修改命令在不重启的情况下立刻生效

在这里插入图片描述

c)打包部署

和之前一样,也是在桌面新建一个目录用于打包,并将通过release运行的要发布的可执行文件拷贝进去
在这里插入图片描述

这里提示我的系统太新了(deepin 15.11😄),让我选择个旧一点的系统使用linuxdeployqt,查阅文档之后发现,这版本的linuxdeployqt只支持Ubuntu16.04和openSUSE 15.0以下Linux系统

在这里插入图片描述

所以我这里换成了Ubuntu14.1并换了个linuxdeployqt版本()同样执行到这一步,显示报错,提示没有加载Icon文件

在这里插入图片描述

因此需要删除默认生成的图标文件default.png,并重新为此提供一个,以logo.png为例,然后再将目录文件下生成的default.desktop文件重命名为picClient.desktop(需要和要打包的可执行文件名称一致),修改内容如下

[Desktop Entry]
Version=1.0			 	# 版本
Type=Application		# 类型
Name=picClient			# app名
Exec=picClient			# app执行路径
Icon=logo.png			# 图标
Comment=This is a simple program	# 说明信息
Terminal=false			# 是否在终端启动
Categories=Development;

完成之后,重新执行linuxdeployqt picClient -appimage命令,提示无误后,将会生成一个以.AppImage结尾的文件

在这里插入图片描述

成功之后,为其赋予权限,运行即可成功显示效果

chmod +x MyApp-x86_64.AppImage
./MyApp-x86_64.AppImage

在这里插入图片描述

注意通过linuxdeployqt方式打包的应用程序,不支持从Qt4到Qt5的源码迁移,因为编译环境不同,先前也是准备直接将我在deepin中的想要发布的程序源码拷贝到我的uUbuntu14中去重新利用Qt来编译之后再使用linuxdeployqt打包,发现始终无法解决cannot execute binary file的问题,后来发现是我Qt版本的原因,一个是Qt4一个是Qt5,所以只能在Ubuntu中重新编写了个简单demo用于发布演示。

通过这种方式打包的文件,由于linuxdeployqt的绿色开源性,所以支持在不同的Linux发行版上运行,很方便,各位也可以尝试下(😄😄)

4.结尾

这篇博文是我查阅许多资料,并且经过自己的实践理解,总结出来的,非常感谢提供帮助的博文,这里附上博文参考链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章