Qt6 qtmqtt编译及演示示例(附带动态库)

news2025/1/17 5:52:22

前言

随着物联网的不断发展,如今很多项目都需要接入,而两年前也是因为项目需要,了解了一些关于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.pri

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include


win32: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~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ReentrantLock源码分析AQS原理

目录 (一)AQS简介 (二)AQS原理剖析 (三)源码思想-加锁: (1)构造方法 (2)公平锁lock方法(核心) 3、acquire获取资源方法(核心) (一)AQS简介 AQS是AbstractQueuedSynchronizer的简称,是一种实现阻塞锁和依赖FIFO队列的同步器框架。其依赖于一个原子变量state,子…

Unity Text Mesh Pro 浮动文字-学习

TextMeshPro(TMP)是unity的一套UI文字方案,支持对顶点、颜色进行编辑,自定义强,可扩展等优点。 对于英文数字即字符只需制作ASCII的文件即可,但是对于中文,如果我们的文字需要动态生成且不可控…

k8s教程(19)-pod之批处理调度

文章目录01 引言02 批处理调度2.1 任务模式分类2.1.1 按实现方式分类2.1.2 按批处理并行分类2.1 案例2.1.1 Job Template Expansion案例2.1.2 Queue with Pod Per Work Item案例2.1.3 Queue with Variable Pod Count案例03 文末01 引言 声明:本文为《Kubernetes权威…

思维方式之系统思维

这世界上的所有事物,都被规律作用着,以一种叫作“系统”的方式存在着。 我们身处时代这个大系统之中,如果没有一种全局的系统观,很容易就会和机遇失之交臂。凡事要顺势而为,用“个位”的管理对抗“千位”的时代&#…

精华推荐 |【Redis技术探索】「底层架构原理」深入透析主从架构的底层原理分析实现机制

📕技术箴言 当心中有更高的山峰去攀登,就不会在意脚下的泥沼。 📕前提概要 Redis高可用的方案包括:持久化、主从复制(及读写分离)、哨兵和集群(Cluster)。 📕&#x1f…

音视频面试涨知识(四)

视频格式播放体验流量占用情况DASH统计直播推流端到播放端延时。支持和视频帧绑定的内容交互。比如,直播答题在播放端的弹窗等。小HLS对视频进行切片,按切片播放,缓存小起播快;拖动时间轴到任意时间播放时,可以快速定位…

dubbo2和dubbo3 入门简介

稳定版本:2.5.3 目前已恢复更新Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC通信、流量治理、可观测性等解决方案, 涵盖 Java、Golang 等多种语言 SDK 实现。3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.1 初识OpenResty

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.1 初识OpenResty48.1.1 初识OpenResty48.1.2 安装OpenResty48 多级缓存 48.1 初识Open…

python 使用tk报错

文章目录Preface解决方法问题1:问题2: **tk.Tk()** 这里的 Tk 的 k 是小写错误信息 ~~并没有什么实际作用/提示~~Preface 最近刚开始学习用python 的时候遇到一个对于我这样的新手来说比较棘手的问题. 我查询了好久, 大多数给出的答案就是代码写错了 而且是不给错误行数的那种…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.3 请求参数处理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.3 请求参数处理48.3.1 OpenResty获取请求参数48.3.2 直接上案例48 多级缓存 48.3 请求…

Service 与 Pod 有什么联系?

目录前言一、创建 Deployment二、创建 Service三、集群外部访问前言 首先我们要清楚,Pod 中的容器很可能因为各种原因故障而死掉,如果真的发生故障,那 Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。而每个 P…

java的垃圾回收浅谈

目录 并发标记问题 三色算法问题 浮动垃圾问题 漏标问题 cms的解决方式 g1的解决方式 跨代(区)引用 CMS垃圾回收日志 G1垃圾回收日志 垃圾回收过程其实都包含两步:标记回收。 标记算法: 引用计数:每个对象都有一个计数器&#xff…

【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)

Hive基础SQL语法 1:DDL操作 DDL是数据定义语言,与关系数据库操作相似, 创建数据库 CREATE DATABASE|SCHEMA [IF NOT EXISTS] database_name显示数据库 SHOW databases;查看数据库详情 DESC DATABASE|SCHEMA database_name切…

2022年都快完了,还学Access的人是不是傻?

2022年都快完了,还学Access的人是不是傻?这是某问答平台,讨论火热的话题。 该问题下,部分程序员拍手称好,对Access语言充满不屑,认为Access过时该被淘汰,笔者作为开发者,并不赞同。事…

【Linux】虚拟地址空间

文章目录❓什么是虚拟地址空间?😊我们先来看这样的一个程序:⚠️感性的认识虚拟地址空间😊Linux具体是怎么实现进程地址空间的❓为什么会存在虚拟地址空间?❓什么是虚拟地址空间? 虚拟地址空间是操作系统为了实现进程管理所设定的一种虚拟…

[附源码]Node.js计算机毕业设计高校学生选课系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Android 跨应用发送自定义广播

话不多说,直接看效果图和代码! 一、效果图 1、未发送广播之前,两个APP的主界面图; 2、发送之后,文本框内容改变。 二、代码 1、创建第一个APP (1)MainActivity中代码如下: p…

分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)一

1.1 赛题背景 昆虫的种类浩如烟海,农田常见的昆虫是人工生态系统的重要组成部分。分辨益 虫和害虫,保留益虫,消灭害虫,对于减轻害虫对农田的生产危害有重要意义。常见 农田害虫共有 138 种,天敌昆虫则为 40 种。病虫害…

D-UNet:一种用于慢性脑卒中病变分割的维数融合U型网络

摘要 二维卷积神经网络忽略了医学图像的三维信息,而三维卷积神经网络对计算资源的需求过大。而本文提出一种新的结构,称为维度融合网络(D-UNet)这个网络在编码阶段创新的结合了二维和三维卷积。所提出的网络结构实现了比2D网络更…

C语言快速过渡C++

下面只讲干货,方便C语言初学者快速上手cpp来刷算法题,如果是希望系统学习cpp的不建议继续阅读,仅限于快速使用 文章目录using namespace stdcin cout 头文件变量声明bool变量const定义常量string类字符串的定义与拼接字符串的输入字符串的处理…