Qt5通过msvc编译qtmqtt来添加MQTT模块


一、下载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) );


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM