编译好mqtt_c 和 mqtt_cpp 的库之后,进行一下测试。
用VS2015编译的32位debug和release,并将c库和cpp库,所以用VS2015建一个win32控制台工程,空项目。
debug和release各自配置各自的lib路径。include和mqtt 都包含进去都是.h文件。
#include<iostream>
#include<string>
using namespace std;
#include "mqtt\async_client.h"
int main(int argc, char* argv[])
{
const std::string TOPIC{ "hello" };
const std::string CLIENT_ID{ "user" };
const std::string ADDRESS{ "127.0.0.1:1883" }; //这里写服务器的IP
const int QOS = 1;
const char * PAYLOAD = { "Hello World!" };
// Create a client
mqtt::async_client cli(ADDRESS, CLIENT_ID);
mqtt::connect_options connOpts;
connOpts.set_keep_alive_interval(20);
connOpts.set_clean_session(true);
try {
std::cout << "Connecting to the MQTT server..." << std::flush;
cli.connect(connOpts)->wait(); // 等待,连接超时
cli.start_consuming();
// Now try with itemized publish.
cli.publish(TOPIC, PAYLOAD, strlen(PAYLOAD), QOS, false);
// Disconnect
std::cout << "OK" << std::endl;
std::cout << "\nShutting down and disconnecting from the MQTT server..." << std::flush;
cli.unsubscribe(TOPIC)->wait();
cli.stop_consuming();
cli.disconnect()->wait();
std::cout << "OK" << std::endl;
}
catch (const mqtt::exception& exc) {
std::cerr << exc.what() << std::endl;
system("pause"); // 退出
return 1;
}
std::cin.get();
system("pause");
return 0;
}
问题1:产生这个问题的原因是当前工程是Debug版本,而引用的库文件时Release版本,只需要把当前的Debug模式改成Release模式就可以解决这个问题。打开解决方案--》属性--》链接器--》输入--》附加依赖项中引用debug版本的lib文件名称。添加其附加库目录。
1> client.cpp
1>paho-mqttpp3-static.lib(connect_options.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(connect_options.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(async_client.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(async_client.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(disconnect_options.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(disconnect_options.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(token.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(token.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(will_options.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(will_options.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(ssl_options.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(ssl_options.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(string_collection.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(string_collection.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(message.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(message.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(iclient_persistence.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(iclient_persistence.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1>paho-mqttpp3-static.lib(response_options.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(client.obj 中)
1>paho-mqttpp3-static.lib(response_options.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”(client.obj 中)
1> 正在创建库 D:\project3\project\mqtt_client\Release\mqtt_client.lib 和对象 D:\project3\project\mqtt_client\Release\mqtt_client.exp
1>LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>paho-mqttpp3-static.lib(response_options.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(ssl_options.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(string_collection.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(message.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(iclient_persistence.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(connect_options.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(async_client.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(token.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(will_options.obj) : error LNK2001: 无法解析的外部符号 __imp___invalid_parameter
1>paho-mqttpp3-static.lib(response_options.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(ssl_options.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(string_collection.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(message.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(iclient_persistence.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(connect_options.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(async_client.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(token.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>paho-mqttpp3-static.lib(will_options.obj) : error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
1>D:\project3\project\mqtt_client\Release\mqtt_client.exe : fatal error LNK1120: 2 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
问题2: 没有添加 ws2_32.lib 。在属性->配置属性->链接器->输入,添加上:ws2_32.lib 即可。
1> client.cpp
1> 正在创建库 D:\project3\project\mqtt_client\Debug\mqtt_client.lib 和对象 D:\project3\project\mqtt_client\Debug\mqtt_client.exp
1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>paho-mqtt3a.lib(WebSocket.obj) : error LNK2019: 无法解析的外部符号 __imp__htons@4,该符号在函数 _WebSocket_close 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2001: 无法解析的外部符号 __imp__htons@4
1>paho-mqtt3a.lib(WebSocket.obj) : error LNK2019: 无法解析的外部符号 __imp__ntohs@4,该符号在函数 _WebSocket_receiveFrame 中被引用
1>paho-mqtt3a.lib(MQTTAsync.obj) : error LNK2019: 无法解析的外部符号 __imp__getsockopt@20,该符号在函数 _MQTTAsync_connecting 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 ___WSAFDIsSet@8,该符号在函数 _Socket_close 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _Socket_close_only 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__connect@12,该符号在函数 _Socket_new 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__ioctlsocket@12,该符号在函数 _Socket_setnonblocking 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__getpeername@12,该符号在函数 _Socket_getpeer 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__recv@16,该符号在函数 _Socket_getch 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__select@20,该符号在函数 _Socket_getReadySocket 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__shutdown@8,该符号在函数 _Socket_close_only 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__socket@12,该符号在函数 _Socket_new 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__WSAStartup@8,该符号在函数 _Socket_outInitialize 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__WSACleanup@0,该符号在函数 _Socket_outTerminate 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__WSAGetLastError@0,该符号在函数 _Socket_error 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__WSASend@28,该符号在函数 _Socket_writev 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__WSAAddressToStringW@20,该符号在函数 _Socket_getaddrname 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__getaddrinfo@16,该符号在函数 _Socket_new 中被引用
1>paho-mqtt3a.lib(Socket.obj) : error LNK2019: 无法解析的外部符号 __imp__freeaddrinfo@4,该符号在函数 _Socket_new 中被引用
1>D:\project3\project\mqtt_client\Debug\mqtt_client.exe : fatal error LNK1120: 19 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
问题3:无法打开各种 PDB文件。
“mqtt_client.exe”(Win32): 已加载“D:\project3\project\mqtt_client\Debug\mqtt_client.exe”。已加载符号。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\ws2_32.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\rpcrt4.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\sspicli.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\cryptbase.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\bcryptprimitives.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\sechost.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\advapi32.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcrt.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\crypt32.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbase.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcp140d.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\msasn1.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbased.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\vcruntime140d.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\vcruntime140d.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已卸载“C:\Windows\SysWOW64\vcruntime140d.dll”
“mqtt_client.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbased.dll”。无法查找或打开 PDB 文件。
“mqtt_client.exe”(Win32): 已卸载“C:\Windows\SysWOW64\ucrtbased.dll”
0x770F3DB2 处(位于 mqtt_client.exe 中)引发的异常: Microsoft C++ 异常: mqtt::exception,位于内存位置 0x007FEFB8 处。
0x00ADAC67 处(位于 mqtt_client.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突。
程序“[13552] mqtt_client.exe”已退出,返回值为 0 (0x0)。
解决:菜单栏的 调试->选项->勾选下面两个位置。等编译过去之后,再把这两个√去掉。
release项目调试通,但是连不上。debug中间总是跳到一个文件,也不知道哪里出问题了。
参考链接:
https://www.cnblogs.com/lisuyun/p/6410393.html
https://www.cnblogs.com/lic02891/archive/2012/11/09/2763210.html