Qt.WebSocket导致的部署失败及解决方案

断了今生、忘了曾经 提交于 2019-11-27 12:23:54

##场景描述

  1. Qt Widgets Application中使用QWebSocket模块时,开发中引用正常(Desktop构建模式),但是使用windeployqt工具部署时,对应的依赖库是没有添加进去的,导致部署失败
  2. QtQuick/V-Play Application中使用Qt.WebSocket模块时,开发中引用正常(Desktop构建模式),使用windeployqt工具部署后,对应的依赖库也没有添加进去,导致部署失败
  3. QtQuick/V-Play Application中​使用Qt.WebSocket模块时,开发中引用异常(Android构建模式),使用部署生成.apk后,找不到对应的模块,导致部署失败

##解决方案(场景1 & 场景2) 场景1和2的部署失败,可以通过windeployqt工具部署后(Desktop构建模式),把QWebSocket对应的依赖库可以手动拷贝一份来解决(有工具还需要手搓总是不爽的)

##解决方案(场景3) 场景3中其实有2个问题:

  1. 开发中找不到import Qt.WebSocket 1.0找不到对应的模块(Android构建模式)
  2. 部署中Qt.WebSocket模块的依赖库没有添加进来

而每次部署生成.apk(Android构建模式),都会重新构建和自动添加依赖库,没法通过手搓来有效控制Qt.WebSocket依赖库的添加:(

  • 针对问题1:

Qt.WebSocket的文档是这么说的:
Note: Prior to Qt 5.5, the import statement was import Qt.WebSockets 1.0 (notice the dot between Qt and WebSockets). The old statement is still supported for backwards compatibility, but it cannot be mixed with the new statement within the same project

为了兼容旧版本语法是什么鬼?然后我去找了下对应的依赖库路径,发现有2个WebSocket相关的路径

  1. %QtDir%/android_armv7/qml/Qt/Websocket/,这个目录下只有一个qmldir文件,内容如下:
module Qt.WebSockets
plugin declarative_qmlwebsockets ../../QtWebSockets/
classname QtWebSocketsDeclarativeModule
typeinfo plugins.qmltypes
  1. %QtDir%/android_armv7/qml/QtWebSockets/,这个目录下有qmldir & plugins.qmltypes & libdeclarative_qmlwebsockets.so这3个文件,这里的qmldir文件,内容如下:
module QtWebSockets
plugin declarative_qmlwebsockets
classname QtWebSocketsDeclarativeModule
typeinfo plugins.qmltypes

稍微总结下我们可以这样理解:Qt.WebSocket(为了兼容Qt5.5.1之前的语法)最终指向QtWebSocket,那么我们直接使用新语法试试?

//import Qt.WebSocket 1.0 //这是旧语法,注释掉
import QtWebSocket 1.0 //新语法
//...code...

然后构建-部署-运行,一切正常.

##Tips:Mac/Linux等其他平台估计也有一样的问题,可以参考一下

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!