-
上一篇的文档有关QT程序在一个新系统上面部署之后,程序运行问题种种,网上很多类似该问题的解决办法就是提示什么处理什么,缺少拷贝什么,总之缺少就补上,问题当然也可以解决。
-
问题是:当我们开发的版本QT库与系统不一致或者系统库版本不支持当前开发的库版本时候,总还是出现platfoms下面的libqxcp.so库依赖系统失败的问题,或者不支持或者 依赖系统的库没有。
针对这个问题,我的上一篇文档有过类似的介绍,就是将缺少的库文件,根据提示,拷贝开发环境的库然后粘贴到目标系统的环境中,这样当前的问题是可以解决的,但是当我们的系统环境运行不同版本的QT库的时候,多个应用程序就不能保证正常运行,出现了系统之间你死我亡的现象,不能共生。
-
今天我就介绍一下针对该问题的解决终极方案,系统能够帮助到正在迷惑的你,少走弯路,节省一点宝贵的时间。
针对库的依赖分一下几类:
-
自定义库,我这里命名为lib,放到程序同级目录即可;(不用修改libc.cnf);
-
QT自带驱动库,例如sqlit、mysql,因此需要将开发环境的plugins目录部署到程序同级目录;
-
QT框架库platforms(拷贝5.12/gcc/plugins/platform文件到程序同级目录)自然不能少,也是发放到同级目录即可;
-
重点说明一下:
自定义库lib除了自己开发动态库之外(包含第三方库文件),还需要包含程序依赖的QT和系统的库,这一点特别重要,就是在编译好的可执行程序当前,编写并执行抓取可执行程序依赖的库,保存到当前lib文件中,这个脚本文件网上也有很多类似的说明,并不太难,稍等我也会附加上去我的抓取脚本的内容。
截止目前,该做的工作似乎已经做完,程序应该可以运行了吧,然而还是碰了一鼻子灰,程序竟然没有启动成功,提示libqxcp.so 依赖失败一堆提示,例如类似:
loaded library "/home/sinovel/S/platforms/libqxcb.so"
./S: symbol lookup error: /lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: undefined symbol: _ZN22QWindowSystemInterface24setPlatformFiltersEventsEb, version Qt_5_PRIVATE_API
-
这也是解决该问题的重点,根据查询资料分析:
platform中的动态库QT官方在编译时第一指向即在上二层级中,放在程序所在目录上一级目录中即满足了platform中动态库的第一寻址路径,防止其从系统库中找寻版本不对的动态库甚至找不到动态库。
-
根据QT的框架特性, QT框架platforms中的库会优先调用当前目录下的lib库(这个是Qt 开发环境5.12/gcc/plugins/platform 环境中lib文件, QT库的目录层次结构需要跟一致,白话就是说当前目录结构层次,需要跟qt开发环境一致),如果没有那么就会找系统的库,当然这时候,系统的库版本就不确定能用了,或者很多库都没有,因此这里最重要的一个步骤就是,需要将QT开发环境中的库platforms上一级的目录lib(5.12/gcc/plugins/lib),拷贝到可执行程序的上一级目录即可,这样一个干净利落的程序就部署完成了。无论系统额QT库版本高低,都没有关系了; 关键是这种方式目标环境可以运行不通版本QT的可执行程序了。
-
抓取程序依赖库脚本内容,程序可以是可执行程序也可以是动态库
附件:
#bash ***.sh
#! bin/base
if [ $# != 1 ]
then
echo "传参数顺序: ./脚本.sh <要发布的可执行文件文件>"
exit 0
fi
LibDir=$PWD/lib
mkdir $LibDir
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
-
代码项目属性设置
在开发代码makefile或者 qt项目文件pro文件中,指定程序寻找路径配置,尽量靠前配置。
QMAKE_LFLAGS += "-Wl,-Bsymbolic,-rpath,\'\$$ORIGIN\'"
QMAKE_LFLAGS += "-Wl,-Bsymbolic,-rpath,\'\$$ORIGIN/lib\'"
QMAKE_LFLAGS += "-Wl,-Bsymbolic,-rpath,\'\$$ORIGIN/../lib\'"
只有足够靠前,在编译链接时,程序第一寻找的第一链依赖的动态库路径才不是系统路径而是指定路径。经试验,这段语句如果放在后面,程序第一寻找的QT平台库会去系统中找而非指定路径,这个应该与makefile的编译顺序有关。
至此,程序可以正常部署运转,开始你的coding旅行吧。
-
有没有方法,改变platforms里面的libqxcp.so的依赖路径?