近期在进行项目国产化开发时遇到了qt项目打包相关若干问题,在此记录先关 问题和解决方案,以便后续相关问题解决。
如果打包过程中不考虑qt依赖,只将程序相关依赖库打包并安装在其他PC上。 此时如果编译时依赖的qt版本高于系统自身所有的qt库版本,就会存在qt版本冲 突的问题导致无法运行。若系统自身带有的qt库版本高于编译时依赖版本,可能 能够正常运行,也可能会存在冲突。所以打包时应将所依赖的qt动态库一并打 包。 将qt库一并打包后,安装在其他PC并运行,此时会存在如图1所示的问题,程 序依旧无法运行。根据报错提示可知此时是因为找不到相关插件所以无法运行, 将qt的platform一并拷贝后再次运行程序。此时可以看到程序还是无法运行,如 图2所示。但报错发生变化,根据报错大概可以知道程序无法正常加载xcb插件。 但内容较少,无法了解真正原因。我们使用export QT_DEBUG_PLUGINS=1来打开q t的debug信息,此时相关信息会打印至终端。再次运行程序。
图1
图2
图3
此时可以看到详细的报错信息,可以看到加载libQt5XcbQpa库是系统自带的版 本,其依赖的qt库为高版本,而我们程序已经加载了我们编译时使用的5.9.6的 版本的QtCore库,所以导致加载xcb库时失败。我们已经打包了相关qt库至同级 文件,且指定程序运行时依赖库目录为同级目录,为什么还会加载系统中的qt 库?进入platforms目录,使用readeld命令查看linqxcb.so发现运行时依赖库目 录为后退两级的lib文件夹(如图4),因为我们没有这个文件夹,所以其查找依 赖时找到了系统路径下的库。
图4
此时可以看到详细的报错信息,可以看到加载libQt5XcbQpa库是系统自带的版 本,其依赖的qt库为高版本,而我们程序已经加载了我们编译时使用的5.9.6的 版本的QtCore库,所以导致加载xcb库时失败。我们已经打包了相关qt库至同级 文件,且指定程序运行时依赖库目录为同级目录,为什么还会加载系统中的qt 库?进入platforms目录,使用readeld命令查看linqxcb.so发现运行时依赖库目 录为后退两级的lib文件夹(如图4),因为我们没有这个文件夹,所以其查找依 赖时找到了系统路径下的库。
图5
第二中解决方案则是修改打包目录层级,将所有的依赖库放入lib文件夹,并保持 和platforms的相对关系,从而使得xcb库能够正常加载,此时程序也可正常运 行。此时最好使用qt.conf指定好plugins路径,qt.conf示例和目录层级示意如下图 所示。
图6