Я разрабатываю приложение IoT C ++ и хочу отправить данные через MQTT. Поэтому я создал заголовочный класс для своих особых нужд:
#include <mqtt/client.h>
class ClientMQTT{
public:
ClientMQTT();
ClientMQTT(std::string _mqtt_ip_address, int _mqtt_port, std::string _mqtt_username, std::string _mqtt_password, std::string _client_id, bool no_publish);
int mqtt_send(char *message, int msg_length, std::string topic);
void report_error(std::string timestamp, std::string message);
bool connect();
bool disconnect();
mqtt::client *client;
std::string mqtt_ip_address;
int mqtt_port;
std::string mqtt_username;
std::string mqtt_password;
std::string client_id;
bool no_publish;
};
Для соединения (dis) я создал две функции, которые я могу вызывать при запуске и выходе программы, bool connect()
а также bool disconnect()
, Тело выглядит так:
bool ClientMQTT::disconnect(){
if(this->client == NULL) return true;
this->client->disconnect();
return !(this->client->is_connected()); //this makes problems!
}
При отключении мне нужно проверить, действительно ли клиент MQTT отключился или нет. Поэтому я называю virtual bool mqtt::client::is_connected()
функция.
Проблема в том, что я получаю следующую ошибку при компиляции / компоновке: /usr/bin/ld: obj/Debug/CAN_Reader.o||undefined reference to symbol 'MQTTAsync_isConnected'
Но я связал MQTT-библиотеку с -lpaho-mqttpp3
, потому что без этой строки кода, программа компилируется и работает …
Кто-нибудь из вас знает, почему возникает эта ошибка?
У меня была та же ошибка, когда я пытался использовать тот же код MQTT Paho C ++. Но я использую VS 2015 на Windows, так что я думаю, что это отличается от вас? Для меня проблема была в MQTTAsync.h. В строке 95 код определяет, является ли это средой Windows. В этом случае он пропустил это и думал, что я был на Linux. Это не сработало:
#if defined(WIN32) || defined(WIN64)
Я сделал это быть
#if defined(WIN32) || defined(WIN64) || defined(_WIN32)
И этот последний, кажется, хорошее определение. Это влияет на то, использует ли он «declspec» (Windows) или «attribute» (linux) для доступа к библиотеке. После этого, я думаю, он мог бы лучше читать мою библиотеку Windows. Таким образом, я сократил количество ошибок с 170 до 36! Прогресс…
Опять же, я не уверен, что это та же проблема, но, возможно, это даст вам подсказку.
Других решений пока нет …