Qt Linux 环境中应用程序打包

系统环境:Ubuntu20.04LTS
开发环境:Qt5.14.1

打包须知:

在进入程序部署打包之前,阅读官方的部署文档Deploy,通常情况下,我们在开发的时候,Qt Creator 的左下角构建模式为Debug,便于我们调试编写程序。Qt的三个构建模式Debug、Profile、Release的区别是: debug可以调试程序,而release不可以。在程序出现错误的时候,在debug模式下通过设置断点来调试程序。当程序所有错误都解决了以后,在release模式下生成程序,就可以对外发布了。debug生成的程序因为包含了调试信息,编译器也未做优化,所以比release模式生成的程序要大很多,而Profile则介于两者之间,用的较少。Qt Linux 环境中应用程序打包_第1张图片
Qt Linux 环境中应用程序打包_第2张图片
一定要确保程序在Debug模式下,能正确运行,方可进行打包(Release),通常我们选择共享动态库的形式打包,一般需要三步:

生成 release 版本的可执行文件 .exe;
找到所有的动态链接库 dll;
将所有的 dll 以及依赖的各种文件和可执行文件打包在一起生成最终的一个可执行文件
这样即可在为未安装Qt的机器上使用。

一、将Qt的构建模式设置为Release,构建程序,将生成对应的程序Release文件夹。

例如本文的示例程序qmlideo生成的Release文件夹:
Qt Linux 环境中应用程序打包_第3张图片
其中,生成的qmlvideo(你的应用程序名称)文件是共享库文件(x-sharedlib),并非可执行文件,
Qt Linux 环境中应用程序打包_第4张图片
如果遇到这样的问题,请在pro文件里加上一行:QMAKE_LFLAGS += -no-pie
重新构建Release,可以看到qmlvideo文件已经成为可执行文件
Qt Linux 环境中应用程序打包_第5张图片
接下来,进入Release文件夹,打开终端, 输入ldd qmlvideo
Qt Linux 环境中应用程序打包_第6张图片
这里是可执行程序qmlvideo依赖的动态库,需要将这些动态库和可执行程序放到一起。
新建一个空文件夹,用来放打包后的程序文件。我建立一新文件NewPro,将可执行文件qmlvideo复制到NewPro,这里写一个脚本,将上述的所有依赖库都找出来。在Release文件夹中新建copylib.sh

#!/bin/bash

LibDir=$PWD"/lib"
Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

$(mkdir $LibDir)

for Variable in ${lib_array[@]}
do
    cp "$Variable" $LibDir
done
#$

设置权限chmod 777 copylib.sh,运行./copy.sh qmlvideo, 在Release中生成了lib文件夹
Qt Linux 环境中应用程序打包_第7张图片
将lib中所有文件复制到新文件夹NewPro中,此时,NewPro文件夹的内容为可执行文件qmlvideo 和lib中的所有动态库。
下一步,补充动态库,因为后续可能会发生“xcb"错误;进入Qt安装目录文件夹,依次进入“版本号”->“gcc_64”->"plugins"中(我这里是Qt5.14.1/5.14.1/gcc_64/plugins/),复制platforms文件夹到NewPro文件夹下:
Qt Linux 环境中应用程序打包_第8张图片将copylib.sh复制到NewPro/platforms文件夹中,运行:./copylib libqxcb.so命令,同样生成lib文件夹(这里是libqxcb的依赖库,若缺少,将触发“xcb”错误),将lib文件夹下所有文件拷到NewPro目录下,遇到文件冲突选择全部替换。
在NewPro目录下,创建脚本文件xxx.sh(xxx为可执行程序名,我这里是qmlvideo.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 "$@"

将NewPro文件夹拷贝到一台同系统没有Qt环境的电脑上,进入NewPro目录后,运行:./qmlvideo.sh命令即可启动程序。

可能出现的问题:

一、"xcb"错误:
在应用程序目录中,打开终端,

export QT_DEBUG_PLUGINS=1

运行应用程序的脚本./qmlvideo.sh ,可以查看依赖库加载过程,如下图:
Qt Linux 环境中应用程序打包_第9张图片
如有not found的依赖库,再去Qt安装路径下的platforms中找到复制过来。

二、Segmentation Fault
本人只是在移植到Ubuntu16时,出现段错误,请确保你的打包系统和移植系统一致。有库的版本问题,依赖问题,你可以选择连依赖基础库,如gcc都带进去.

三、程序图片无法加载,图标无法显示

若程序有图片需要加载,涉及到图形依赖库,在Qt安装目录中和platforms同目录下有个imageformats目录:
Qt Linux 环境中应用程序打包_第10张图片将整个imageformats目录复制到NewPro目录中即可,同时,如果有预加载图片,也要一并放入NewPro中,若以qrc的形式加载,也要将qrc文件目录放到NewPro中。

你可能感兴趣的:(ubuntu,c++,后端,qt5)