Ubuntu qt程序打包教程
-
首先使用QT编译需要打包的工程,编译一个release版本,例如得到一个执行文件test;
-
在任意目录下创建一个目录test-pack;
-
在该目录下新建一个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
-
在当前目录打开终端,运行:
./copylib.sh test
其中, test是运行copylib.sh 脚本的参数,脚本调用了 ldd test指令来获取test运行时需要用到的库,并将库文件复制到当前目录的lib文件夹中。 -
进入qt安装目录的platforms文件夹,我的路径是:
/opt/Qt5.12.3/5.12.3/gcc_64/plugins/platforms
然后将整个文件夹复制到打包的目录中;
将上述的copylib.sh脚本复制到test-pack/platforms目录中,然后运行./copylib.sh libqxcb.so
,这时会得到 libqxcb.so的库文件夹。
(之所以需要用libqxcb.so的库文件,具体看文末的参考资料,这个跟运行的具体程序有关,需要用到哪些QT的库,就再打包对应的库和其依赖的库) -
将第5步骤中生成的所有库,复制到test-pack目录中,然后删除掉Giptables/platforms目录;
-
在test-pack目录中新建一个运行脚本test.sh,目的是添加库的环境变量,至此就打包完成了,运行程序时执行test.sh脚本即可,注意脚本执行前记得设置执行权限,命令:
sudo chmod +x test.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 export QT_QPA_PLATFORM_PLUGIN_PATH=./ $dirname/$appname "$@"
-
最后可以用deb包的方式,打包deb包,然后在新的机器上安装使用。
ps:过程中可能遇到的问题:
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同一级目录下
参考资料 http://doc.qt.io/qt-5/linux-deployment.html