第一次打包linux下的QML程序,一路磕磕绊绊,如果有更好的方式,欢迎留言。
1、使用release编译出可执行文件,这一步大家都知道吧;
2、将可执行文件放入新建文件夹project中,同时创建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 可执行文件
此时会多出一个文件夹lib,可执行文件用到的一些库会被塞进lib文件夹里,我们把lib/中的内容都拷贝到project中,即与lib同级目录,然后删除lib文件夹;
3、将copylib.sh复制到Qt/6.5.3/gcc_64/plugins/platforms目录中,执行
./copylib.sh libqxcb.so
此时会生成libqxcb.so的库文件,并存储在/platforms/lib中,此时将整个platforms文件拷贝到project文件中,并将Qt/6.5.3/gcc_64/plugins/platforms/lib与copylib.sh删除;
4、将project/platforms/lib中的文件都拷贝到project/中,并删除project/platforms/lib文件夹,到这一步,QWidget程序就可以运行了,但如果是QML,则需要继续;
5、将Qt/6.5.3/gcc_64/qml整个文件夹拷贝到project/下;
6、将Qt/6.5.3/gcc_64/plugins/xcbglintegrations整个文件夹拷贝到project/下;
7、将Qt/6.5.3/gcc_64/lib整个文件夹拷贝到project/下;
8、在project/下创建可执行文件.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=./lib
export LD_LIBRARY_PATH
$dirname/$appname "$@"
一些改进:第五步中不用将整个qml文件夹拷贝进项目文件夹,其实只需要将qml中用到的具体模块拷贝进来,第七步中也不用将整个lib拷贝进来,可以直接运行打包后的sh脚本,此时会报错,缺少哪个库,就拷贝哪个库。并且把LD_LIBRARY=./lib改为LD_LIBRARY=¥dirname。
加载失败的库,一般都是它的其他依赖库找不到了,可以从对应的qml模块中找到,在qml模块中添加copylib.sh文件,然后执行./copylib.sh 加载失败的库,会生成一个lib文件夹,在里边把对应的依赖库复制到项目文件夹中。