今天将qt的程序打包在客户机器上部署,弹出如下提示:
Got keys from plugin meta data ("xcb")
Cannot load library /home/lc1/Desktop/comTool/bin/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/lc1/Desktop/comTool/bin/platforms/libqxcb.so))
QLibraryPrivate::loadPlugin failed on "/home/lc1/Desktop/comTool/bin/platforms/libqxcb.so" : "Cannot load library /home/lc1/Desktop/comTool/bin/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/lc1/Desktop/comTool/bin/platforms/libqxcb.so))"
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
这种错误只会在linux或类linux操作系统上出现,Windows上不会出现。因为Windows机器不需要qxcb库。造成这种错误的原因是:1):部署软件时,没有将Qt插件文件下的platforms中的libqxcb.so库部署上去。2): 原因1)中的libqxcb.so库部署了,但是原因 1)中的libqxcb.so库又依赖了其它的Qt库,而这些依赖的库本应该从你提供的安装包的库目录查找的,现在却是从其它地方找的,如:从上面可以看到libqxcb.so依赖了libQt5XcbQpa.so.5,这个库本应该在你安装目录下,比如:你安装目录下有lib文件夹,且lib文件夹下有个libQt5XcbQpa.so.5,但从上面的提示可以看出,程序搜索的是/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5,而不是你安装包目录下的lib文件夹下的libQt5XcbQpa.so.5,虽然说都是libQt5XcbQpa.so.5,但版本不一致可能会导致出现加载库失败,比如:你部署机器的linux系统自带的Qt(一般是因为linux有图形界面,而图形界面用到了Qt,所以对于图形界面的linux系统一般会有些Qt的库)版本是5.6.1,而你部署的程序是用其它版本开发的,比如:Qt 5.14.1,这就会导致不兼容而加载库失败。
解决方法如下:
1):在你程序需要部署的目录即安装包目录下新建platforms目录。
2):到你开发的机器上的Qt安装目录下的plugins/platforms目录下找到libqxcb.so,并将其拷贝到步骤1)中的platforms目录。
3):执行ldd libqxcb.so 以便找出libqxcb.so依赖的所有Qt库。
4):将步骤3)中找到的依赖库中所有和Qt有关的库拷贝到你安装包下的库目录下,如:
安装包目录/lib
然后建立一些库的链接。
经过这四步骤后,目录应该如下;
5):执行:
sudo /etc/profile
在文件的末尾加入:
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:安装包目录/lib
注意:有部分linux在/etc/profile中设置LD_LIBRARY_PATH不起作用,对这部分linux请自行查阅相关手册。
6):重启linux。
7):执行如下命令:
echo $LD_LIBRARY_PATH
如果输出中包含了 “ 安装包目录/lib”目录,则5)步骤配置成功
如果上面都没问题,则部署的程序应该能跑起来。