在Linux 下如何打包免安装的QT程序?

  • Post author:
  • Post category:linux


如题,近期因为项目需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。网上索罗了下,打包QT程序的方式很多,主要分为以下几种:

1. 打包成安装包形式;

2. 打包成二进制文件,附带运行库的形式:

– windows下,有很多工具,教程也比较多,运行库基本是dll文件

– linux下,需要靠脚本协助,很多教程都不完整,运行库基本是so文件

笔者这里只演示如何在linux下打包免安装程序,程序名称为giptables,QT版本是5.7.1,以下如出现这个名称,则一律替换成读者自己的应用程序名称。

0、找个地方,比如桌面,创建空文件夹

Giptables

,这个将用来存放giptables程序的运行文件

1、先将工程使用Release模式编译

2、打开编译输出文件的文件夹(带二进制文件giptables的那个)

笔者的文件夹名称是build-giptables-Desktop_Qt_5_7_1_GCC_64bit-Release

3、在上一步的文件夹中新建文件copylib.sh,通过指令设置权限

chmod 777 copylib.sh


4、在 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

5、打开终端并进入到当前文件夹,输入

./copylib.sh giptables

其中,

giptables

是运行copylib.sh 脚本的参数,脚本实际上是调用了

ldd giptables

指令获得

giptables

运行时需要哪些库,并将库都复制放到当前目录的

lib

文件夹中。

运行完上述指令后,同目录下会生成lib文件夹,这里我们将其称作

giptables的库文件夹

,避免与下文内容混淆

6、将

giptables的二进制文件



giptables的库文件夹

里所有的文件复制到

Giptables文件夹

中,注意:这里是把lib里的所有文件复制出来,不用复制lib文件夹

7、进入QT的安装目录,找到

platforms

文件夹,笔者的路径是

~/Qt5.7.1/5.7/gcc_64/plugins/platforms

将整个

platforms

文件夹复制到

Giptables文件夹

中,注意:这时复制的是整个文件夹,这使得

Giptables文件夹

中会多出一个

platforms

文件夹

8、将上文的

copylib.sh

放到

Giptables/platforms/

中,并运行

./copylib.sh libqxcb.so

,这时会得到lib文件夹——

libqxcb.so的库文件夹


ps:为什么是libqxcb.so呢?具体看文末的参考资料,这个跟你要运行的程序有关,需要用到哪些QT的库,就再打包对应的东西。

9、将

libqxcb.so的库文件夹

中的所有文件复制

Giptables文件夹

中,然后删除掉

Giptables/platforms/lib

文件夹

10、在

Giptables文件夹

中新建脚本

giptables.sh

,执行

chmod 777 giptables.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 "$@"

到这里就基本完成了,将

Giptables文件夹

复制到需要运行程序的目标主机即可,在目标主机中,运行程序,都采用

./giptables.sh

而不是

./giptables

,即运行程序的sh脚本,而不是二进制文件


过程中遇到的问题:

1、运行

copylib.sh

时报找不到库的错误:必须保证在源文件夹中运行

copylib.sh

,而不能先将文件复制出来,然后再运行

copylib.sh

生成

lib


2、在目标主机中提示

This application failed to start because it could not find or load the Qt platform plugin “xcb”

这是因为没有生成

libqxcb.so的库文件夹

,或者没有将生成的文件夹中所有的文件放到

giptables.sh

同一级目录下,笔者最后生成的目录结构如下

Giptables(文件夹) -- platforms(文件夹) -- libqxcb.so
                 |                    \__ *.so
                 |
                 \__ giptables.sh
                 \__ *.so

参考资料

http://doc.qt.io/qt-5/linux-deployment.html



版权声明:本文为z3512498原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。