如题,近期由于项目需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。网上索罗了下,打包QT程序的方式不少,主要分为如下几种:
1. 打包成安装包形式;
2. 打包成二进制文件,附带运行库的形式:
- windows下,有不少工具,教程也比较多,运行库基本是dll文件
- linux下,须要靠脚本协助,不少教程都不完整,运行库基本是so文件html
笔者这里只演示如何在linux下打包免安装程序,程序名称为giptables,QT版本是5.7.1,如下如出现这个名称,则一概替换成读者本身的应用程序名称。
0、找个地方,好比桌面,建立空文件夹Giptables
,这个将用来存放giptables程序的运行文件
一、先将工程使用Release模式编译
二、打开编译输出文件的文件夹(带二进制文件giptables的那个)linux
笔者的文件夹名称是build-giptables-Desktop_Qt_5_7_1_GCC_64bit-Releaseweb
三、在上一步的文件夹中新建文件copylib.sh,经过指令设置权限chmod 777 copylib.sh
四、在 copylib.sh 中加入内容windows
#!/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
五、打开终端并进入到当前文件夹,输入./copylib.sh giptables
bash
其中,
giptables
是运行copylib.sh 脚本的参数,脚本其实是调用了ldd giptables
指令得到giptables
运行时须要哪些库,并将库都复制放到当前目录的lib
文件夹中。app
运行完上述指令后,同目录下会生成lib文件夹,这里咱们将其称做giptables的库文件夹
,避免与下文内容混淆svg
六、将giptables的二进制文件
和 giptables的库文件夹
里全部的文件复制到Giptables文件夹
中,注意:这里是把lib里的全部文件复制出来,不用复制lib文件夹工具
七、进入QT的安装目录,找到platforms
文件夹,笔者的路径是ui
~/Qt5.7.1/5.7/gcc_64/plugins/platforms
将整个platforms
文件夹复制到Giptables文件夹
中,注意:这时复制的是整个文件夹,这使得Giptables文件夹
中会多出一个platforms
文件夹spa
八、将上文的copylib.sh
放到Giptables/platforms/
中,并运行./copylib.sh libqxcb.so
,这时会获得lib文件夹——libqxcb.so的库文件夹
ps:为何是libqxcb.so呢?具体看文末的参考资料,这个跟你要运行的程序有关,须要用到哪些QT的库,就再打包对应的东西。
九、将libqxcb.so的库文件夹
中的全部文件复制Giptables文件夹
中,而后删除掉Giptables/platforms/lib
文件夹
十、在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脚本,而不是二进制文件
过程当中遇到的问题:
一、运行copylib.sh
时报找不到库的错误:必须保证在源文件夹中运行copylib.sh
,而不能先将文件复制出来,而后再运行copylib.sh
生成lib
二、在目标主机中提示
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