Windows10下VS2017编译MQTT C与编译MQTT C++
前言:
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
内容来自:菜鸟教程
一、准备工作
1. https://github.com/eclipse/paho.mqtt.cpp master版本
2. https://github.com/eclipse/paho.mqtt.c master版本
选择一个3.16版本的,时间巨慢,耐心等待。下载一个win32位一个win64位的编译器,分别用于编译32位和64位库。也有可能下载一个就可以了。
------>>
4. Windows系统是win10 64位
5. VS2017(目前的MQTT仅支持VS2015及以上的版本编译,低版本不支持,本人用VS2010试了好久,各种问题。。。),稍后用VS2015,可能会更顺利,因为好多教程都是基于VS2015编译的。
二、编译MQTT的C库
1. 直接打开下载好的CMake.exe
2. 把下载好的 paha.mqtt.c-master 解压到一个路径下。在paha.mqtt.c-master 文件里面新建一个vs2017_64文件,用于放置CMake编译的内容。输入 paha.mqtt.c-master 源码路径, 输入编译路径,点击configure。
(建议:将CPP文件和C文件同时解压,然后将C文件直接放进CPP文件中,可以避免很多问题)我个人是分开了。也能通过。
3. 选择需要使用的VS编译器。这里选择VS2017——64位进行,点击Finish.
4. 勾选需要编译的文件项目等。然后点击Configure.
5. 提示错误。是因为openssl路径没有写上。点击OK。
6. 填上编译好的openssl库的路径。
7. 点击configure,错误都消失,然后点击 Generate,就能看到Open Project 可以点击了。
8. 进入编译目录,找到 *.sln,用VS2017打开。以管理员身份打开VS2017,然后再从目录中去打开项目,会免去后面的一个bug。
先编译debug64, 之后再编译其他版本。因为没有勾选 PAHO_ENABLE_TESTING,所以项目只有28个,如果都选PAHO_ENABLE_TESTING,项目会有45个。
9. 这一步很重要!!! 把每个项目的字符集,都改为Unicode字符集
10. 所有项目改完之后:
编译方法一: 先编译ALL-BUILD, 没问题的话,再编译 INSTALL。 这个方式,遇到问题,不知道是哪个项目的,很难排查错误。
编译方法二:先编译动态库和静态库,每一个项目,右键->生成。再编译可执行文件项目,右键-> 生成。
我是先编译最下面红框,再编译中间红框,最后从最上面红框,依次进行exe项目的编译。
箭头指着的 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 个无法解析的外部命令
下面这些项目,也编译成功。
红框的项目失败,其他两个成功。可能是因为VS2017升级之后,没有WIN32控制台项目导致的,只是WINDOWS项目。
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 个 ==========
最后分别编译红框和黑框项目,红色成功,黑色失败。
报错如下:
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
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。
2. 选择VS2017_64位,完成。
3. 会出现如下错误提示,点击OK。
4. 勾选需要的编译项目,再点击configure。如下:
5. 出现错误,点击OK, 去配置路径。
7. 路径配置如下:添加openssl的库,添加paho.mqtt.c-master 的 .h文件路径,添加 C库的 lib
添加的C库的lib 时,遇到问题:-mqtt3as.lib 用VS2017可以编译通过,但是用VS2015的时候,报错了。VS2015改用了 -mqtt3a.lib 通过的。
8. 点击configure,没有报错,再点击genreate,没有报错,然后Open Project 变成可以点击的按钮,说明成功。然后就可以用VS2017去打开 .sln 文件了。
9. 需要修改所有工程的字符集选项为Use Unicode Character Set
编译方式一:完全编译ALL_BUILD工程。如果没有错误,编译INSTALL工程。
编译方式二:如下,按照1,2,3分别【生成】。先分别生成库文件,然后生成 ALL_BUILD, 然后 生成INSTALL
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是个什么鬼?