winodos下使用VS2022编译eclipse-paho.mqtt.c并演示简单使用的 demo
本文演示C语言如何使用eclipse-paho.mqtt.c库,包含自行编译库的步骤或者下载编译好的文件。
1.下载paho.mqtt.c库源码(zip 文件)
到官网选择C版本的paho源码进行下载
Eclipse Paho | The Eclipse Foundation


或者到下述连接下载
Releases · eclipse/paho.mqtt.c · GitHub

2.编译paho.mqtt.c库(下述步骤不支持生成SSL的文件)
2.1.windows 下编译所需环境
a. cmake(可参考文章【windows下cmake的小白级入门使用教程(hello world)】(windows下cmake的小白级入门使用教程(hello world)_cmake windows_西晋的no1的博客-CSDN博客 )
b. vistual studio(如下图是vs2022必须的组件,cmake支持哪个版本的vs,可参照文章【查看当前cmake版本支持哪些版本的Visual Studio】( 查看当前cmake版本支持哪些版本的Visual Studio-CSDN博客 )进行确定)

2.2.编译过程
a.如果是下载的 zip 文件,先解压代码,进入代码文件夹 paho.mqtt.c-1.3.9,在当前文件夹的地址栏中输入cmd,然后回车,调出命令行窗口。

b.在命令行窗口中依次输入下述3行内容:
md build
cd build
cmake -G "Visual Studio 17" ..

注:需要根据电脑上安装的cmake和vs版本进行填写,如有些低版本的cmake不支持Visual Studio 2022(升级cmake版本),有的电脑上没有安装Visual Studio 2022(安装Visual Studio 2022,或者选择电脑上有的版本)
vs版本对应
| Visual Studio 17 2022 | = Generates Visual Studio 2022 project files. |
| Use -A option to specify architecture. | |
| Visual Studio 16 2019 | = Generates Visual Studio 2019 project files. |
| Use -A option to specify architecture. | |
| Visual Studio 15 2017 [arch] | = Generates Visual Studio 2017 project files. |
| Optional [arch] can be "Win64" or "ARM". | |
| Visual Studio 14 2015 [arch] | = Generates Visual Studio 2015 project files. |
| Optional [arch] can be "Win64" or "ARM". | |
| Visual Studio 12 2013 [arch] | = Generates Visual Studio 2013 project files. |
| Optional [arch] can be "Win64" or "ARM". | |
| Visual Studio 11 2012 [arch] | = Generates Visual Studio 2012 project files. |
| Optional [arch] can be "Win64" or "ARM". | |
| Visual Studio 10 2010 [arch] | = Deprecated. Generates Visual Studio 2010 project files. |
| Optional [arch] can be "Win64" or "IA64". | |
| Visual Studio 9 2008 [arch] | = Generates Visual Studio 2008 project files. |
| Optional [arch] can be "Win64" or "IA64". |
编译成功之后,在build文件夹下会生成Eclipse Paho C.sln
c.用Visual Studio2022打开build文件夹下的Eclipse Paho C.sln
d.根据实际使用场景选择合适的版本(Debug或Release),然后选择生成->重新生成解决方案,等待一段时间,可以看到0失败

e.此时可以在build文件夹下看到src文件夹下有个Debug或Release文件夹,里面有编译后生成的文件:paho-mqtt3a.dll、paho-mqtt3a.lib、paho-mqtt3c.dll、paho-mqtt3c.lib。
paho-mqtt3a : 一般实际开发中就是使用这个,a表示的是异步消息推送(asynchronous)。
paho-mqtt3as : as表示的是 异步+加密(asynchronous+OpenSSL)(本文步骤无法生成)。
paho-mqtt3c : c 表示的应该是同步(Synchronize),一般性能较差,是发送+等待模式。
paho-mqtt3cs : 同上,增加了一个OpenSSL而已(本文步骤无法生成)。
3.使用示例
3.1 新建C语言工程
具体操作过程可以参考文件【VS2022 和 VS2010 C语言控制台输出 Hello World】(https://blog.csdn.net/xijinno1/article/details/127826231)
3.2 在demo.cpp文件的同文件夹下新建一个文件夹,命名为【pahoC】
3.3 将源代码src文件夹下所有.h的文件和build\src\Debug(或Release)文件夹下的4个文件(paho-mqtt3a.dll、paho-mqtt3a.lib、paho-mqtt3c.dll、paho-mqtt3c.lib)粘贴到pahoC文件夹下
注意:后续3步的操作,一定要在与编译pahoC的配置一样,否则程序将不可使用paho-mqtt3a.lib、paho-mqtt3c.lib。

3.4 在demo工程属性中添加包含目录
$(LocalDebuggerWorkingDirectory)pahoC

3.5 在demo工程属性中添加附加库目录
$(LocalDebuggerWorkingDirectory)pahoC

3.6 在demo工程属性中添加附加依赖项
paho-mqtt3a.lib、paho-mqtt3c.lib

3.7 将下述示例代码覆盖demo.cpp中的所有内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "ExampleClientPub"
#define TOPIC "MQTT Examples"
#define PAYLOAD "Hello World!"
#define QOS 111
#define TIMEOUT 10000L
int main(int argc, char* argv[]) {
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
pubmsg.payload = (void*)PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT / 1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return rc;
}
3.8 运行测试程序
程序正常运行,将有如下输出,是正常现象:

运行程序过程中可能出现下面的报错,只需要将编译生成的paho-mqtt3a.dll、paho-mqtt3c.dll放于测试程序生成的exe所在的文件夹下即可。

相关文章:
winodos下使用VS2022编译eclipse-paho.mqtt.c并演示简单使用的 demo
本文演示C语言如何使用eclipse-paho.mqtt.c库,包含自行编译库的步骤或者下载编译好的文件。 1.下载paho.mqtt.c库源码(zip 文件) 到官网选择C版本的paho源码进行下载 Eclipse Paho | The Eclipse Foundation 或者到下述连接下载 Releases ec…...
【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理
XML(可扩展标记语言)是一种常用的数据交换格式,它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言,提供了多种方式来处理XML数据。其中,Jsoup 是一个流行的Java库,用于解析和操作XML文…...
QT图形视图框架绘制曲线图和Smith图
QT图形视图框架绘制曲线图和Smith图 QGraphicsView是Qt框架中的一个图形视图部件,用于显示和处理2D图形元素。它提供了强大的工具来创建交互式和自定义的图形应用程序。在绘制折线图和Smith图时,使用QGraphicsView有以下一些优点: 交互性&am…...
0032【Edabit ★☆☆☆☆☆】【每秒帧数】Frames Per Second
0032【Edabit ★☆☆☆☆☆】【每秒帧数】Frames Per Second algorithms language_fundamentals math numbers Instructions Create a function that returns the number of frames shown in a given number of minutes for a certain FPS. Examples frames(1, 1) // 60 fra…...
【LeetCode】1423 可获得的最大点数(中等题)
【题目描述】 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数…...
2024年天津中德应用技术大学专升本物流管理专业课考试大纲
天津中德应用技术大学物流管理专业(高职升本科)2024年专业基础考试大纲 一、试卷类型 物流管理专业升本专业课考试共1套试卷,总分200分,考试时间为2小时。内容包含仓储与配送管理40%、物流基础30%,运输管理30%&#…...
目标检测YOLO实战应用案例100讲-船舶目标检测及编队识别(续)
目录 3.2.3 分类与回归 3.2.4 网络预设置与训练策略 3.3 实验与分析 3.3.1 实验环境 3.3.2...
【MySQL索引与优化篇】索引的数据结构
文章目录 1. 概述2. 常见索引结构2.1 聚簇索引2.2 二级索引(辅助索引、非聚簇索引)2.3 联合索引 3. InnoDB的B树索引的注意事项3.1 根页面位置万年不动3.2 内节点中目录项记录的唯一性 4. MyISAM中的索引方案5. InnoDB和MyISAM对比6. 小结7. 补充:MySQL数据结构的合…...
Qt Widget 删除之后还会显示 问题
目录 问题描述:Qt QWidget 删除之后还会显示 解决方案: Part1: 使用 deleteLater Part2: 使用 setParent(nullptr) 父控件为空 还有一种不常用的方法 隐藏: 问题描述:Qt QWidget 删除之后还会显示 Qt 无论使用 while (Layo…...
关系型数据库的问题和NoSQL数据库的应用
1.关系型数据库的问题 系统使用通用的商用关系型数据库,系统内部数据采用中央集中方式存储。系统投入使用后,初期用户数量少,系统运行平稳。一段时间后,用户数出现了爆炸式增长,系统暴露出诸多问题,集中表…...
二进制安装k8s
192.168.11.12 master01 192.168.11.12 y4 node01 192.168.11.14 y5 node02 192.168.11.15 对环境进行初始化,主机192.168.11.12、主机y4、主机y5,三台主机都要做以下操作,唯一不同的就是修改主…...
超简洁ubuntu linux 安装 cp2k
文章目录 打开下载网址解压接下来的步骤讲解 将解压的包移到对应路径下最后运行 打开下载网址 需要从github下载:下载网址 两个都可以从windows下先下载,再复制到linux中, 如果不能复制,右键这两个,复制链接…...
判断日期区间或季节等
使用JavaScript的Date对象来获取当前日期,并通过比较判断是否在指定的日期范围内(如3月16日-9月15日)。以下是一个示例代码: var currentDate new Date(); // 获取当前日期 var startRange new Date(currentDate.getFullYear()…...
入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql(7)
入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql 什么是数据持久化?使用 Python 进行数据持久化步骤 1: 安装 MySQL步骤 2: 安装必要的 Python 库步骤 3: 连接到 MySQL 数据库步骤 4: 创建数据表步骤 5: 插入数据步骤 6: 查询数据步骤 7: 关闭连接…...
c语言从入门到实战——分支和循环
分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符:&& , || , !4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习:闰年的判断4.5 短路 5. swit…...
交易所(Exchange, ACM/ICPC NEERC 2006, UVa1598)rust解法
你的任务是为交易所设计一个订单处理系统。要求支持以下3种指令。 BUY p q:有人想买,数量为p,价格为q。 SELL p q:有人想卖,数量为p,价格为q。 CANCEL i:取消第i条指令对应的订单(输…...
shell_51.Linux获取用户输入_无显示读取,从文件中读取
无显示读取 有时你需要从脚本用户处得到输入,但又不想在屏幕上显示输入信息。典型的例子就是输入密码,但除此之外还有很多种需要隐藏的数据。 -s 选项可以避免在 read 命令中输入的数据出现在屏幕上(其实数据还是会被显示,只不过 …...
NOIP2023模拟2联测23 集训
题目大意 给定 n n n个数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an,你需要找到一个集合 S S S,使得 S S S中严格大于 S S S的平均数的数字个数尽量多,输出最多的个数。 注意:这里的集合是可重集,…...
【设计模式】第3节:设计模式概论
设计模式不是代码,而是某类问题的通用方案。设计模式的本质是提高软件的维护性、通用性和扩展性,并降低软件的复杂度。一共有24种设计模式,可以分为创建型模式、结构型模式和行为型模式三大类。设计模式中比较重要的有:单例模式、…...
风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)
1.前言 1.1.运行效果:风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)_哔哩哔哩_bilibili 1.2.环境库: 如果库版本不一样, 一般也可以运行,这里展示我运行时候的库版本,是…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
