使用 Eclipse Paho MQTT 编译 Visual C++ Win32 项目时出现 LNK2019 错误
LNK2019 error when compiling a Visual C++ Win32 project with Eclipse Paho MQTT
我正在尝试构建一个使用 Eclipse Paho MQTT 库的 Visual C++ Win32 项目 - 请参阅 https://eclipse.org/paho/clients/c/
该库采用 2 个文件的形式:
- paho-mqtt3c.lib
- paho-mqtt3c.dll
该库最初是用 C 语言编写的 - 我尝试过使用预编译的二进制文件并自己编译它。
在我的客户端 Visual C++ 项目中,在链接器选项下,我在 "Additional Library Directories" 字段中包含了正确的库路径,并且直接在 [=30= 中包含了 paho-mqtt3c.lib 文件] 场地。但是,当我尝试构建时,链接器会因使用的每个库函数出现错误而退出。所有错误都具有相似的格式:
Error 2 error LNK2019: unresolved external symbol "int __cdecl MQTTClient_connect(void *,struct MQTTClient_connectOptions *)" (?MQTTClient_connect@@YAHPAXPAUMQTTClient_connectOptions@@@Z) referenced in function _main c:\Project\scrapbook\MQTT_Example\MQTT_Example\main.obj MQTT_Example
我的代码如下:
#include <MQTTClient.h>
#include <MQTTClientPersistence.h>
: : :
// Start MQTT connection
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
// Convert CString to char*
int connectResponse;
char* szBuf = strBroker.GetBuffer(strBroker.GetLength()) ;
// Create client
MQTTClient_create(&client, szBuf, "MQTTTestClient", MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL);
// Connect to broker
if ((connectResponse = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
// Oops.. that didn't work!
}
有没有人知道如何解决这个问题? (我知道有数百万个 LNK2019 问题,但到目前为止我找不到任何解决我问题的问题...)
原来问题出在我试图在 C++ 项目中包含一个 C 库(带有很多 C 风格的声明函数)。
解决方案是将函数声明(即包含头文件的位置)包装在 extern "C" 块中:
extern "C"{
#include <MQTTClient.h>
#include <MQTTClientPersistence.h>
}
这告诉 linker link 针对 C 而不是 C++ 函数。
我正在尝试构建一个使用 Eclipse Paho MQTT 库的 Visual C++ Win32 项目 - 请参阅 https://eclipse.org/paho/clients/c/ 该库采用 2 个文件的形式:
- paho-mqtt3c.lib
- paho-mqtt3c.dll
该库最初是用 C 语言编写的 - 我尝试过使用预编译的二进制文件并自己编译它。
在我的客户端 Visual C++ 项目中,在链接器选项下,我在 "Additional Library Directories" 字段中包含了正确的库路径,并且直接在 [=30= 中包含了 paho-mqtt3c.lib 文件] 场地。但是,当我尝试构建时,链接器会因使用的每个库函数出现错误而退出。所有错误都具有相似的格式:
Error 2 error LNK2019: unresolved external symbol "int __cdecl MQTTClient_connect(void *,struct MQTTClient_connectOptions *)" (?MQTTClient_connect@@YAHPAXPAUMQTTClient_connectOptions@@@Z) referenced in function _main c:\Project\scrapbook\MQTT_Example\MQTT_Example\main.obj MQTT_Example
我的代码如下:
#include <MQTTClient.h>
#include <MQTTClientPersistence.h>
: : :
// Start MQTT connection
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
// Convert CString to char*
int connectResponse;
char* szBuf = strBroker.GetBuffer(strBroker.GetLength()) ;
// Create client
MQTTClient_create(&client, szBuf, "MQTTTestClient", MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL);
// Connect to broker
if ((connectResponse = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
// Oops.. that didn't work!
}
有没有人知道如何解决这个问题? (我知道有数百万个 LNK2019 问题,但到目前为止我找不到任何解决我问题的问题...)
原来问题出在我试图在 C++ 项目中包含一个 C 库(带有很多 C 风格的声明函数)。
解决方案是将函数声明(即包含头文件的位置)包装在 extern "C" 块中:
extern "C"{
#include <MQTTClient.h>
#include <MQTTClientPersistence.h>
}
这告诉 linker link 针对 C 而不是 C++ 函数。