前言
随着物联网的不断发展,如今很多项目都需要接入,而两年前也是因为项目需要,了解了一些关于mqtt的用法,并将其过程记录成几篇博客,近一年多时间陆陆续续有好多人私信咨询关于mqtt相关的问题,其中又有很多是关于最基础的源码编译相关的。我之前刚接触的时候还没有Qt6,那时候我的编译环境是Qt5.12.3+vs2017
,下载代码后直接qmake编译,编译过程也很顺利,基本没遇到什么困难,一路畅通。
随着Qt6的发布,Qt官方开始推崇cmake编译,而qtmqtt对应的版本和Qt发布的版本一致的,所以qtmqtt从6.0发布以来,也开始默认用cmake编译。这样一来,很多之前习惯用Qt5的童鞋就有点摸不着头脑了,特别是一些刚入门的新手,看到Qt工程,习惯性的一上来就去找pro工程文件,但是Qt6的cmake工程是没有pro文件的,所以更是二脸懵逼。接着又是在之前的文章评论,又是私信来问。本来我自己也没有安装Qt6,索性趁空闲时间配置一个Qt6环境然后重新编译一下qtmqtt,然后运行demo重新跑一遍。把过程详细记录下来,供有需要的参考。
之前的博文地址:
Qt开发MQTT(一) 之Qt官方Qt MQTT
其他文章
资源在这里,点击下载
环境:Qt6.2.4+vs2019 x64
里面包含了编译好的Debug和Release动态库 ,以及qt在线安装包软件和perl安装包。
正文
回到主题,今天的目的是使用Qt6编译qtmqtt,目前Qt最新发布的版本是Qt6.4.1,我比较喜欢用长维版本(比较稳定,Qt官方长期维护),目前Qt6的长维版本是6.2.4
,所以我配置的Qt环境是Qt6.2.4+vs2019 x64
Qt安装及环境配置就不说了吧,新版本的Qt都是在线安装的,在官方下载一个安装器,选择相应的版本安装就可以了。
接下来我们主要看qtmqtt的流程。
qtmqtt源代码下载
源代码在github上 ,地址:https://github.com/qt/qtmqtt
将代码clone到本地后,先开看下项目分支:
可以看到qtmqtt是从最早的5.10版本开始,一直到现在最新的6.3.0版本,这里的版本号是对应Qt的发布版本号。由于我配置的Qt环境是Qt6.2.4,所以这里也对应将qtmqtt的 6.2.4分支迁到本地。
git checkout -b 6.2.4 origin/6.2.4
如果你想编其他版本,那么下载对应的源代码就可以了。
源代码目录:
环境准备
除了配置Qt和vs环境,
在编译mqtt之前,需要先安装perl,python,conan
python安装直接在官网下载,安装完设置环境变量
conan安装有两种方式,一种是pip安装,需要python环境,另一种是官网下载exe安装。由于已经安装了python,所以可以直接用pip安装,更方便一些,直接cmd打开终端,输入 pip install conan
就可以安装了。
全部安装完后,记得设置环境变量:
编译
接下来在Qt Creator中打开qtmqtt源码,前面说了 Qt6默认是cmake编译,所以没有pro工程文件,mqtt源码下只有CMakeLists文件,所以在Qt Creator的时候直接载入CMakeLists文件即可。
导入后是这样
ok,接下来有个很重要的步骤,在Qt Creator中使用系统环境变量
点击 项目, 找到 构建 环境变量
点击path项,然后点击右侧的 Edit按钮,弹窗点击确定。
然后再编译,就成功了
如果不设置的话 ,还是会报错。
ok了,经过以上步骤可以快速的编译出debug和release版本了。
编译出来的文件
编译Demo
库编译完成,接下来跑一个demo。
在mqtt源码目录下有examples,里面有一些基础demo,拷贝一个出来跑一下。
示例里面还是保留了之前的工程文件pro,所以导入到Qt Creator后直接qmake编译就可以。
但是demo中有些地方需要改一下,由于我们编译完mqtt后没有将库和modules等相关文件拷贝配置到Qt的安装目录下去,所以直接引用mqtt模块是找不到的。
所以直接按第三方库使用的方式,单独把lib、dll、include 文件放到自己的demo中去引用就行了。
而mqtt自带的demo就需要改造一下才能用。
打开simpleclient.pro文件
这里直接去掉mqtt模块引用,以及target path设置
手动添加一个mqtt.pri模块
创建一个mqtt文件夹
将lib 和 include文件拷贝过来放到模块中,这样也方便后期直接挪到其他项目中去使用
注意,这里用到的include 头文件不能直接用编译源码输出目录下的include文件,
就是这个
千万不能直接把源码输出目录下的include文件拷到自己项目中去使用,因为这里面的头文件只是一个源码相对路径的文件引用。拿到自己的项目中去使用会报错,所以应该直接从mqtt源码目录下把真正的头文件拷贝出来放到include下面。
mqtt.pri文件是自己创建的,添加库引用
!contains(INCLUDEDFIES, mqtt.pri) {
INCLUDEDFIES += mqtt.priINCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/includewin32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt6Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt6Mqttd}
接下来修改mainwindow.h中的头文件引用
这里是直接以模块的方式引用头文件,由于我们没有添加mqtt模块到Qt安装目录下,所以这里要修改成demo目录下的头文件引用
#include "QtMqtt/qmqttclient.h"
然后 cpp中的头文件引用直接注释掉,多余了
接下来就可以直接编译这个demo了。
运行起来是这样
在以前的文章中已经介绍过这个demo,文章在这里
Qt官方提供了一个测试服务器地址,直接在 Host处输入:broker.hivemq.com
然后点击connect连接
状态是2表示连接成功,接下来点击订阅,然后点击发布按钮,就可以收到发布的消息了
ok了 大功告成。
最后
将本次编译出来的动态库及demo打包出来了,有需要的可以下载,
资源在这里,点击下载
环境:Qt6.2.4+vs2019 x64
里面包含了编译好的Debug和Release动态库 ,以及qt在线安装包软件和perl安装包。
demo下的mqtt目录可以直接拷贝到其他项目使用
Finish~