QT MQTT库在win上和linux上的使用
QT的两种MQTT库
目前QT使用MQTT库的方法有两种:
- 一种为使用官方库qmqtt:
https://github.com/qt/qtmqtt
- 另一种是为使用EMQX提供的QT库:
https://github.com/emqx/qmqtt
版本差异
两个版本存在一定差异
- 官方库qtmqtt功能比较强,支持MQTT5.0协议,SSL,有比较完整例程提供参考。但是官方库版本众多,在github中有32个分支版本,如果QT版本不对应可能会导致一些编译错误,使得编译无法通过。
- emqtt库功能较弱,开发文档介绍太简单,在emqtt的github中的Readme文件中简单介绍了connect,和一些信号和槽。连接服务器只支持IP,使用域名需要自己使用QHostInfo转化为IP。但是相比官方库,其编译简单,对多个QT版本兼容性较好,方便在不同版本QT使用。此库同时也支持SSL,但是MQTT5.0还没有试过是否支持。
Windows下QT使用MQTT库
在Windows平台编译使用官方MQTT的例子已经有博客介绍了,可以参考以下两个博客:
- 官方库qtmqtt编译使用:
https://blog.csdn.net/luoyayun361/article/details/104671603
编译前需要注意的问题:3、4中的错误很可能为编译了不对应QT版本的Qmqtt库,可在官方github分支中查找自己QT对应的版本。在这里我使用的是QT5.8.0版本编译官方库,所以我使用了最接近QT5.8.0的版本qtmqtt-5.12版本。
按照对应版本的QTMQTT库进行编译一般不会出现错误,实测完成1、2中的错误修改后编译完成,成功提取lib文件。
- 其中编译官方库需要除了此博客中的注意点以外,还需要注库的源文件路径中不能出现中文,否则无法进行编译。
- 编译可能会出错 QtMqtt/qmqttglobal.h: No such file or directory。
解决方法为:在QT的安装目下include文件夹下创建QtMqtt文件夹,例如 Qt\5.8\mingw53_32\include\QtMqtt将源文件src/mqtt下所有.h头文件添加到我们创建的QtMqtt文件夹。
问题的主要原因是:编译器是按照在Qt安装目录下搜索的,但我们文件是我们自己随意放的目录下的 src\mqtt 路径下。原文:
https://blog.csdn.net/qq_39280795/article/details/105455436
- 编译可能会出错 qmqttconnection.cpp:169: error: ‘errorOccurred’ is not a member of ‘QAbstractSocket’
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
qmqttconnection.cpp 中 168行有这么一句:connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
就是这句出了问题。查帮助文档或者源代码都可以发现 QAbstractSocket 没有 errorOccurred 这个 信号。有的那个信号叫:
void error(QAbstractSocket::SocketError socketError)
所以要改写成:
connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, static_cast<void(QMqttConnection::*)(QAbstractSocket::SocketError)>(&QMqttConnection::transportError) );
原文:https://blog.csdn.net/liyuanbhu/article/details/106597506
4.错误qmqttconnection.cpp:1455: error: ‘class QList’ has no member named ‘resize’
此错误为QT6的QMQTT类中成员,使用了QT5编译,当然无法找到。使用老版本QT需要在github仓库中选择对应版本的分支。
5.编译运行官方例子simpleclient.pro中出现的问题:error: QMqttClient: No such file or directory此错误可以将
#include <QMqttClient>
改为
#include <qmqttclient.h>
此外还会出现error: QtMqtt/QMqttClient: No such file or directory
此错误可以将
#include <QtMqtt/QMqttClient>
改为
#include <qmqttglobal.h>
- emqx_mqtt:
https://luoyayun361.blog.csdn.net/article/details/104699062
Windows上QT5.8按照此教程没有出现错误。
Linux下QT使用MQTT库
- Linux下官方QTMQTT库程序从win上可以移植过来,但是注意QT版本不能相差太大,并且lib下dll的文件需要换成.so文件。这就意味着需要将QTMqtt代码使用Linux上QT的gcc++重新编译一遍,并且将lib下的dll,.a文件换成linux编译出的lib。
1.编译qtmqtt,勾选release,注意kit套件版本,要和winQT版本对应上,一般ubuntu系统会自带QT,注意安装使用配套Win上写的程序的QT版本。
2.编译会出现和Win上同样的错误QtMqtt/qmqttglobal.h: No such file or directory。
此时可按照win上qtmqtt教程一样在qt的安装目录/opt/Qt5.8.0/5.8/gcc_64/include目录下新建QtMqtt文件夹,将源码文件qtmqtt-5.12/src/mqtt中的.h头文件复制到其中。
3.再次编译成功,会在源码文件夹中找到lib文件夹下的lib文件,替换windows下编好程序的lib库(.a,.dll文件)。
4.相比在win上的程序还需在程序的.pro文件中多加入一段else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd
else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
5.编译win上移植过来的程序运行成功
- Linux下emqx的移植,同理与qtmqtt一样,需要在linux平台下重新编译源码。
可以看博客:https://blog.csdn.net/wct3344142/article/details/107022706
QT MQTT库在win上和linux上的使用相关推荐
- SVN从win迁移到Linux上
工作需要把SVN从win迁移到Linux上,花了几天时间看资料搞定,简单记录一下: 公司用的SVN环境为 Windows server 2003 ,VisualSVN 2.1.5版本 1.dump出S ...
- opencv可以在linux上运行,linux上 安装并 运行opencv
我是在树莓派上安装的. 1.先安装依赖项 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. sudo apt-get install build-es ...
- window上远程访问linux上的neo4j的设置
1.在neo4j.conf文件中的 将dbms.connectors.default_listen_address=0.0.0.0前面的注释去掉即可 2.直接采用:linux主机的ip + :7474 ...
- QT——移植官方MQTT库
1.软件版本 QT5.12.10 Win11 mingw 2.概述 Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者 ...
- Qt开发MQTT(一) 之Qt官方Qt MQTT
概述 Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者使用方法大同小异,并且均提供了源码.那么,这里先来介绍第一种, ...
- c#如何在linux上运行程序,在Linux上运行C#
众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...
- printf如何消后续0_Hello World背后的故事:如何在Linux上编译C语言程序
欢迎访问我的网站查看原文: https://lulaoshi.info/blog/2020/05/31/compile-c-hello-world-on-linux.htmllulaoshi.inf ...
- tess4j linux so文件,linux上安装tess4j项目
本文主要介绍了linux上安装tess4j项目,通过具体的解释说明,让我们从中学到linux上安装tess4j项目的精髓所在,让我们对Linux内部原理越来越熟悉,希望大家能够在以后的学习中更加快速的 ...
- 在 Ubuntu Linux 上从源代码构建 Qt 6.2.2的简短教程
Qt 6.2.0 是 Qt 6 系列的第3个版本,功能与 Qt 5 相当,因此有望成为第一个被新 Qt 项目或从 Qt 5 移植的项目广泛采用的版本.在这篇文章中我提供有关在 Ubuntu Linux ...
最新文章
- oracle查询保留2位小数
- 进程线程001 进程线程结构体和KPCR
- python--微信小程序获取手机号码报错
- iOS开发(8)UISwitch
- linux 浏览器 links,linux下的命令行浏览器links
- html ace编辑器,Tiny-editor
- Linux路由应用-使用策略路由实现访问控制
- Laravel核心解读--Console内核
- (50)常见命名方式
- 关于js的冒泡--新手踩坑案例
- [edu #63][div2 #554][div3 #555]
- nginx匹配规则详解
- asp连接excel数据库
- Python爬取淘宝商品信息
- 执教《送给盲婆婆的蝈蝈》有感
- Mbit/s MB/s MiB/s单位
- 【安卓】电脑执行脚本控制安卓手机
- 【C++】C/C++面试之17道经典编程题目分析
- 爱普生 RS330 打印机墨水连供装置墨盒吸墨复位方法
- 基于canoe开发的Bootloader刷写上位机,符合uds流程