欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows10下VS2017编译MQTT C与编译MQTT C++

程序员文章站 2022-07-14 20:31:01
...

前言:

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

Windows10下VS2017编译MQTT C与编译MQTT C++

内容来自:菜鸟教程

一、准备工作

1. https://github.com/eclipse/paho.mqtt.cpp     master版本

2. https://github.com/eclipse/paho.mqtt.c    master版本

3. https://cmake.org/files/     

选择一个3.16版本的,时间巨慢,耐心等待。下载一个win32位一个win64位的编译器,分别用于编译32位和64位库。也有可能下载一个就可以了。

Windows10下VS2017编译MQTT C与编译MQTT C++ ------>>  Windows10下VS2017编译MQTT C与编译MQTT C++

4. Windows系统是win10 64位

5. VS2017(目前的MQTT仅支持VS2015及以上的版本编译,低版本不支持,本人用VS2010试了好久,各种问题。。。),稍后用VS2015,可能会更顺利,因为好多教程都是基于VS2015编译的。

Windows10下VS2017编译MQTT C与编译MQTT C++

二、编译MQTT的C库

1. 直接打开下载好的CMake.exe

Windows10下VS2017编译MQTT C与编译MQTT C++

2. 把下载好的 paha.mqtt.c-master  解压到一个路径下。在paha.mqtt.c-master 文件里面新建一个vs2017_64文件,用于放置CMake编译的内容。输入 paha.mqtt.c-master 源码路径, 输入编译路径,点击configure。

建议:将CPP文件和C文件同时解压,然后将C文件直接放进CPP文件中,可以避免很多问题)我个人是分开了。也能通过。

Windows10下VS2017编译MQTT C与编译MQTT C++

3. 选择需要使用的VS编译器。这里选择VS2017——64位进行,点击Finish.

Windows10下VS2017编译MQTT C与编译MQTT C++

4. 勾选需要编译的文件项目等。然后点击Configure.

Windows10下VS2017编译MQTT C与编译MQTT C++

5. 提示错误。是因为openssl路径没有写上。点击OK。

Windows10下VS2017编译MQTT C与编译MQTT C++

6. 填上编译好的openssl库的路径。

Windows10下VS2017编译MQTT C与编译MQTT C++

7. 点击configure,错误都消失,然后点击 Generate,就能看到Open Project 可以点击了。

Windows10下VS2017编译MQTT C与编译MQTT C++

8. 进入编译目录,找到 *.sln,用VS2017打开。以管理员身份打开VS2017,然后再从目录中去打开项目,会免去后面的一个bug。

Windows10下VS2017编译MQTT C与编译MQTT C++

先编译debug64, 之后再编译其他版本。因为没有勾选 PAHO_ENABLE_TESTING,所以项目只有28个,如果都选PAHO_ENABLE_TESTING,项目会有45个。

Windows10下VS2017编译MQTT C与编译MQTT C++

9. 这一步很重要!!! 把每个项目的字符集,都改为Unicode字符集

Windows10下VS2017编译MQTT C与编译MQTT C++

10. 所有项目改完之后:

编译方法一: 先编译ALL-BUILD, 没问题的话,再编译 INSTALL。 这个方式,遇到问题,不知道是哪个项目的,很难排查错误。

编译方法二:先编译动态库和静态库,每一个项目,右键->生成。再编译可执行文件项目,右键-> 生成。

我是先编译最下面红框,再编译中间红框,最后从最上面红框,依次进行exe项目的编译。

Windows10下VS2017编译MQTT C与编译MQTT C++

箭头指着的 Base64TestOpenSSL 项目,出现了一个问题。还没找到原因。可能是因为VS2017升级之后,没有WIN32控制台项目导致的,只是WINDOWS项目。

...MSVCRT.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 main,该符号在函数
 "int __cdecl __scrt_common_main_seh(void)" (aaa@qq.com@YAHXZ) 中被引用
2>D:\project3\MQTT\paho.mqtt.c-master\vs2017_64\src\Debug\Base64TestOpenSSL.exe : 
fatal error LNK1120: 1 个无法解析的外部命令

下面这些项目,也编译成功。

Windows10下VS2017编译MQTT C与编译MQTT C++

红框的项目失败,其他两个成功。可能是因为VS2017升级之后,没有WIN32控制台项目导致的,只是WINDOWS项目。

Windows10下VS2017编译MQTT C与编译MQTT C++

2>MSVCRT.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 main,该符号在函数
 "int __cdecl __scrt_common_main_seh(void)" (aaa@qq.com@YAHXZ) 中被引用
2>D:\project3\MQTT\paho.mqtt.c-master\vs2017_64\src\Debug\Sha1TestOpenSSL.exe : 
fatal error LNK1120: 1 个无法解析的外部命令
2>已完成生成项目“Sha1TestOpenSSL.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 1 个,失败 1 个,跳过 0 个 ==========

 最后分别编译红框和黑框项目,红色成功,黑色失败。

Windows10下VS2017编译MQTT C与编译MQTT C++

报错如下:

1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: 命令“setlocal
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: D:\project3\tools\cmake-3.16.4-win64-x64\bin\cmake.exe -DBUILD_TYPE=Debug -P cmake_install.cmake
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmErrorLevel
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: exit /b %1
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmDone
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :VCEnd”已退出,代码为 1。
1>已完成生成项目“INSTALL.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 22 个,跳过 0 个 ==========

解决方案:以管理员身份运行VS2017,然后从VS2017打开改项目,编译INSTALL即可通过。

11. 测试一下C库,在目录窗口,输入cmd,回车,输入 MQTTVersion.exe

Windows10下VS2017编译MQTT C与编译MQTT C++

12. 结果没有error,暂时说明编译的没毛病。

D:\project3\MQTT\paho.mqtt.c-master\vs2017_64\src\Debug>MQTTVersion
MQTTVersion: print the version strings of an MQTT client library
Copyright (c) 2012, 2018 IBM Corp.
Specify a particular library name if it is not in the current directory, or not executable on this platform
--- Trying library paho-mqtt3c ---
Product name: Eclipse Paho Synchronous MQTT C Client Library
Version: 1.3.1
Build level: 2020-02-20T02:04:53Z
--- Trying library paho-mqtt3cs ---
Product name: Eclipse Paho Synchronous MQTT C Client Library
Version: 1.3.1
Build level: 2020-02-20T02:04:53Z
OpenSSL version: OpenSSL 1.0.2 22 Jan 2015
OpenSSL flags: compiler: cl  /MDd /Od -DDEBUG -D_DEBUG -DOPENSSL_THREADS  -DDSO_WIN32 --perfix=c:\download\openssl-101\build_debug64 -W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE
OpenSSL build timestamp: built on: reproducible build, date unspecified
OpenSSL platform: VC-WIN64A
OpenSSL directory: OPENSSLDIR: "/usr/local/ssl"
--- Trying library paho-mqtt3a ---
Product name: Eclipse Paho Asynchronous MQTT C Client Library
Version: 1.3.1
Build level: 2020-02-20T02:04:53Z
--- Trying library paho-mqtt3as ---
Product name: Eclipse Paho Asynchronous MQTT C Client Library
Version: 1.3.1
Build level: 2020-02-20T02:04:53Z
OpenSSL version: OpenSSL 1.0.2 22 Jan 2015
OpenSSL flags: compiler: cl  /MDd /Od -DDEBUG -D_DEBUG -DOPENSSL_THREADS  -DDSO_WIN32 --perfix=c:\download\openssl-101\build_debug64 -W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE
OpenSSL build timestamp: built on: reproducible build, date unspecified
OpenSSL platform: VC-WIN64A
OpenSSL directory: OPENSSLDIR: "/usr/local/ssl"

D:\project3\MQTT\paho.mqtt.c-master\vs2017_64\src\Debug>

 

三、编译MQTT的Cpp库

1. 打开CMake.exe ,找到paho.mqtt.cpp-master 解压好的文件。输入 源文件路径,在源文件内,新建一个cpp_vs2017_64文件夹,用于存放编译好的可执行文件。点击Configure。 

Windows10下VS2017编译MQTT C与编译MQTT C++

2. 选择VS2017_64位,完成。

Windows10下VS2017编译MQTT C与编译MQTT C++

3. 会出现如下错误提示,点击OK。

Windows10下VS2017编译MQTT C与编译MQTT C++

4. 勾选需要的编译项目,再点击configure。如下:

Windows10下VS2017编译MQTT C与编译MQTT C++

5.  出现错误,点击OK, 去配置路径。

Windows10下VS2017编译MQTT C与编译MQTT C++

7. 路径配置如下:添加openssl的库,添加paho.mqtt.c-master 的 .h文件路径,添加 C库的 lib

添加的C库的lib 时,遇到问题:-mqtt3as.lib 用VS2017可以编译通过,但是用VS2015的时候,报错了。VS2015改用了 -mqtt3a.lib  通过的。

Windows10下VS2017编译MQTT C与编译MQTT C++

8.  点击configure,没有报错,再点击genreate,没有报错,然后Open Project 变成可以点击的按钮,说明成功。然后就可以用VS2017去打开 .sln 文件了。

Windows10下VS2017编译MQTT C与编译MQTT C++  Windows10下VS2017编译MQTT C与编译MQTT C++

9. 需要修改所有工程的字符集选项为Use Unicode Character Set

编译方式一:完全编译ALL_BUILD工程。如果没有错误,编译INSTALL工程。

编译方式二:如下,按照1,2,3分别【生成】。先分别生成库文件,然后生成 ALL_BUILD,  然后 生成INSTALL

Windows10下VS2017编译MQTT C与编译MQTT C++

ALL_BUILD 的编译结果。

14>------ 已启动生成: 项目: ALL_BUILD, 配置: Debug x64 ------
14>Building Custom Rule D:/project3/MQTT/paho.mqtt.cpp-master/CMakeLists.txt
========== 生成: 成功 14 个,失败 0 个,最新 4 个,跳过 0 个 ==========

INSTALL的编译结果:

解决方案:以管理员身份运行VS2017,然后从VS2017打开改项目,编译INSTALL即可通过。

1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: 命令“setlocal
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: D:\project3\tools\cmake-3.16.4-win64-x64\bin\cmake.exe -DBUILD_TYPE=Debug -P cmake_install.cmake
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmErrorLevel
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: exit /b %1
1>C:\Program Files (x86)\Microsoft Visual
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :cmDone
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
1>C:\Program Files (x86)\Microsoft Visual 
Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(138,5): error MSB3073: :VCEnd”已退出,代码为 1。
1>已完成生成项目“INSTALL.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 18 个,跳过 0 个 ==========

这次是熟练的进行了编译,之前不熟练的时候,遇到很多问题,并将问题整理到 ---> 问题集锦

 

以上俩个库都是编译的debug版本,后来又编译了release版本。将所有的坑点注意到,就一气呵成了,没有任何错误。

参考链接:MQTT是个什么鬼?

 

 

 

相关标签: 音视频开发