项目/可执行文件名:QTAppName
打包项目存放的文件名:pack(这个文件名无所谓)
脚本名:
copylib.sh(类似ldd命令):用于将.so库文件的依赖项复制并放入自动生成的 “lib文件” 中。
QTAppName.sh(注:该脚本名为"可执行文件名.sh")“:用于最后执行可执行文件的脚本
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
QTAppName.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 copylib.sh QTAppName.sh
若是还有其他依赖项目,如:所编写的程序有操作数据库的动作,还需要将与platforms同级目录中的sqldrivers文件夹也拷贝到“pack文件夹”中
QTAppName.sh放入pack,并使用 ./QTAppName.sh 调用测试是否成功
问题一:打包后在其他设备上尝试 ./QTAppName.sh 运行,报错Inconsistency detected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion `nlist > 1‘ failed!
解决方案:该问题大概率是由libc(该库是linux底层的一个基本库)的版本不一致导致的,可以使用以下命令查看libc版本
ldd --version
若是版本不一致可以尝试更新libc6,但是并不推荐该方法,因为这是一个底层库这样做可能有风险,且该库的高版本并不一定兼容低版本,手动安装指定版本,系统可能会在安装的过程中崩溃。
sudo apt-get update
sudo apt-get install libc6
**推荐方法:**使打包主机和运行的环境主机的版本号(不是内核版本)一致,且没有更新过
cat /etc/os-release //可以查看发行版本
问题二:依赖缺失
解决方案:
ldd 依赖库名.so
决方案:
ldd 依赖库名.so
尝试使用find查询打包主机上对应依赖项,并添加