编译安装 QtMqtt 的几个问题及解决办法

最近一个项目中要用到 MQTT Client 的一些功能。Qt 的发行版还没有包含相关的模块。但是在下面这个 Qt 的官网上已经能找到相关的模块了:

https://codereview.qt-project.org/#/admin/projects/qt/qtmqtt

github 上也能搜到不少相关的代码:

https://github.com/qt/qtmqtt
https://github.com/toni1991/QtMqtt
https://github.com/KurtPattyn/QtMqtt

在这篇博客里,我们使用 https://github.com/qt/qtmqtt 上的代码。这个模块应该算是 Qt 的官方发布的。

首先下载源代码,解压后进入 qtmqtt-dev\ 目录,在这个目录下建个 build 目录,进入 build 目录执行:

qmake ..\qtmqtt.pro
nmake
nmake install

直接编译会报很多错误,我们一个一个来解决。

qmqttauthenticationproperties.h:33: error: C1083: 无法打开包括文件: “QtMqtt/qmqttglobal.h”: No such file or directory

打开 qmqttauthenticationproperties.h 文件,发现有这么两句:

#include <QtMqtt/qmqttglobal.h>
#include <QtMqtt/qmqtttype.h>

在 Qt 的 include 目录下新建一个 QtMqtt 文件夹(注意 x86 和 x64 所在的目录不一样),把 头文件都复制一份到这个目录。

再编译就不报这个错误了。

下一个错误是:qmqttconnection.cpp:169: error: C2039: “errorOccurred”: 不是“QAbstractSocket”的成员

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) );

再次编译。还有错误:

qmqtttopicname.cpp:148: error: C2039: “KeepEmptyParts”: 不是“Qt”的成员

qmqtttopicname.cpp 148 行代码是这样的:

return d->name.split(QLatin1Char('/'), Qt::KeepEmptyParts);

改写成:

return d->name.split(QLatin1Char('/'), QString::KeepEmptyParts);

再次编译,还有最后一个错误:

qmqtttopicname.cpp:189: error: call to 'qHash' is ambiguous

qmqtttopicname.cpp 189行是:

return qHash(name.d->name, seed);

改为:

return qHash(static_cast<QString>(name.d->name), static_cast<uint>(seed));

类似的还有:

return qHash(filter.d->filter, seed);

改为:

return qHash(static_cast<QString>(filter.d->filter), static_cast<uint>(seed));

至此,编译就没什么问题了。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐