一、下载QtMQTT源码
源码下载地址:
这里使用GitHub地址为例,拉取源码库到本地:
$ git clone https://github.com/qt/qtmqtt.git
切换工作目录到源码库目录,并变更分支到对应的 Qt 版本(这里以 5.14.2 为例):
$ cd qtmqtt
$ git checkout 5.14.2
注:如果不切换分支,直接编译,会提示错误,编译也不会通过
Windows 环境下请确保已安装 perl,因为 Qt 的命令工具 syncqt.pl 需要 perl。
二、在 Linux 下编译并安装 QtMQTT
使用 qmake 命令生成用于构建模块的 Makefile 文件。
hauto@ubuntu:~/qtsource/qtmqtt$ qmake
Info: creating stash file /home/dsyx/ws/qtmqtt/.qmake.stash
Info: creating cache file /home/dsyx/ws/qtmqtt/.qmake.cache
构建模块,并将模块安装到 Qt 的安装目录中(详情见 Makefile 文件):
hauto@ubuntu:~/qtsource/qtmqtt$ make all
# 此处省略构建输出的信息
# ...
hauto@ubuntu:~/qtsource/qtmqtt$ make install
# 此处省略安装输出的信息
# ...
安装 QtMQTT 文档
hauto@ubuntu:~/qtsource/qtmqtt$ make docs
hauto@ubuntu:~/qtsource/qtmqtt$ make install_docs
注意:
在 Linux 下构建的文档可能无法正常显示(由于 qtmqtt.qch 文件有错)。
可以在 Windows 下构建文档然后将其 qtmqtt\doc 中的 qtmqtt.qch 文件复制到 Linux 下的 Qt 安装目录的文档目录下(如:Qt/Docs/Qt-5.15.0)。
安装 QtMQTT 示例
hauto@ubuntu:~/qtsource/qtmqtt$ make sub-examples-install_subtargets
三、在 Windows 下编译并安装 QtMQTT
在 Windows 下进行编译需要用到 MSVC。以 VS2017 为例,默认安装下 VS2017 并不会将 MSVC 的运行环境配置到系统的 PATH 中,官方给出的建议是使用 VS2017 提供的批处理文件来自动配置 MSVC 的运行环境。这些批处理文件位于*** D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build*** 中,其中 vcvars32.bat 用于配置 32-bit MSVC 的运行环境;vcvars64.bat 用于配置 64-bit MSVC 的运行环境。
注:MinGW用户请参考Linux
以 64-bit MSVC 为例,打开 cmd,并切换其工作目录以执行批处理文件:
C:\>D:
D:\>cd D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build>vcvars64.bat
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v16.6.5
** Copyright (c) 2020 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
在 Windows 下,Qt 的命令工具同样也需要配置运行环境。Qt 官方提供了批处理文件 qtenv2.bat 用于配置 Qt 命令工具的运行环境。这个批处理文件位于 Qt 安装目录下对应编译器目录的 bin 目录下。
在 cmd 中切换工作目录并执行 qtenv2.bat 以配置 Qt 命令工具的运行环境:
D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build>cd D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin
D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin>qtenv2.bat
Setting up environment for Qt usage...
Remember to call vcvarsall.bat to complete environment setup!
将工作目录切换到 QtMQTT 的源码库目录,执行 qmake 命令生成用于构建模块的 Makefile 文件:
D:\Qt\Qt5.14.2\5.14.2\msvc2017_64>cd F:\qtmqtt
F:\qtmqtt>qmake
Info: creating stash file C:\Users\dsyx\ws\qtmqtt\.qmake.stash
Info: creating cache file C:\Users\dsyx\ws\qtmqtt\.qmake.cache
构建模块,并将模块安装到 Qt 的安装目录中(详情见 Makefile 文件):
F:\qtmqtt>nmake all
:: 此处省略构建输出的信息
:: ...
F:\qtmqtt>nmake install
:: 此处省略安装输出的信息
:: ...
安装 QtMQTT 文档
F:\qtmqtt>nmake docs
F:\qtmqtt>nmake install_docs
安装 QtMQTT 示例
F:\qtmqtt>nmake sub-examples-install_subtargets
四、期间遇到的错误及解决方案
1.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) );