用QT开发完之后,需要在其他Linux系统平台运行,那么如何打包QT程序呢?
一、准备两个脚本
ldd.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
xxxx.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 "$@"
给这两个脚本加权限
chmod 777 xxxxx.sh
二、打包过程
1.添加程序依赖库
(1)新建一个空的文件夹,用于存放程序及其动态库
(2)将ldd.sh脚本复制到编译目录
(3)执行“./ldd.sh xxxxxxxxx”,会在当前目录生成lib文件夹。其中存放着运行xxxxxxxxx所依赖的库文件;
(4)将lib文件夹中的所有文件复制到第1步新建的文件夹中的lib文件夹中。至此,就可以删除生成的lib文件夹和ldd.sh脚本了.
2. 添加 Qt 相关依赖库
(1)将ldd.sh脚本复制到Qt5安装目录(…/Qt5.12.0/5.12.0/gcc_64/plugins/platforms)的platforms文件夹中;
(2)执行**“./ldd.sh libqxcb.so”,将生成的lib文件夹中的所有文件拷贝到新建文件夹中的lib**文件中。有些库可能重复,点击“替换”即可。执行完该步骤后就可以删除生成的lib文件夹和ldd.sh脚本了;
(3)返回上一级,将platforms整个文件夹拷贝到新建文件夹中,层级关系如下图;
(4)最后将xxxxxxx.sh脚本拷贝到新建文件夹中即可。然后将整个“新建文件夹”压缩就可以在其他机器上解压缩后运行。
移至其他平台会遇到权限问题,可通过以下命令,给xxxx文件夹里所有文件加权限
chmod -R 777 xxxx
附上在打包过程中肯会遇到的问题
经过上网查询,这个问题主要是platforms文件夹中libqxcb.so的依赖库没有拷贝导致的。可是如何拷贝依赖库,是个大问题!
在程序当前目录下输入ldd platforms/libqxcb.so后,提示/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 “not found”,去原linux电脑中,确实找到了libQt5XcbQpa.so.5文件,但把这个文件拷贝到release所在目录下并没有效果!
研究了一天,才明白libQt5XcbQpa.so.5文件是链接文件!使用ls -al可以找到链接文件对应的源文件!把源文件拷贝到release目录下,再新建一个相同名字的链接文件,才算完成了这个libQt5XcbQpa.so.5资源文件的打包!!
新建链接文件的命令:ln -s $PWD/libQt5XcbQpa.so.5.8.0 libQt5XcbQpa.so.5。