Проблемы с подключением очень простого MQTT-клиента (Azure IOT Hub SDK) - PullRequest
0 голосов
/ 14 октября 2019

Я следовал официальной документации и описанному здесь руководству MS Azure IOT SDK для C

https://docs.microsoft.com/de-de/azure/iot-hub/iot-hub-device-sdk-c-intro

для создания моего очень простого собственного клиента для отправки сообщений MQTT. Но на машине с Ubuntu я не могу заставить этого клиента работать. Компиляция и компоновка выполняются с помощью cmake и make. Но команда make VERBOSE = 1 работает с ошибками «неопределенная ссылка» (см. Скриншот). Я думал, что все библиотеки были доступны в системе после установки SDK через apt-get. Но сейчас кажется, что некоторые отсутствуют. Не могли бы вы дать мне информацию о том, каких библиотек не хватает, или о том, как выяснить, каких из них не существует (возможно, один из них - libon parson)? Это вывод make / linker (только несколько строк из нескольких строк):

/ usr / bin / cmake -E cmake_link_script CMakeFiles / mqttsender.dir / link.txt --verbose = 1 /usr / bin / cc -rdynamic CMakeFiles / mqttsender.dir / mqttsender.co -o mqttsender -liothub_client -liothub_client_mqtt_transport -laziotsharedutil -lssl -lpthread -lcurl -lssl -lcryp -lssl -llrypl -llryptogcc / x86_64-linux-gnu / 7 /../../../../ lib / libiothub_client.a (iothub_client_ll_uploadtoblob.co): в функции parse_result_json': iothub_client_ll_uploadtoblob.c:(.text+0x334): undefined reference to json_parse_string '"/ usr / lib / gcc / x86_64-linux-gnu / 7 /../../../../ lib / libiothub_client_mqtt_transport.a (iothubtransport_mqtt_common.co): в функции free_transport_handle_data': iothubtransport_mqtt_common.c:(.text+0x1e0): undefined reference to mqtt_client_deinit '/ usr / lib / gcc / x86_64-linux-gnu / 7/../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.co): в функции publish_mqtt_telemetry_msg': iothubtransport_mqtt_common.c:(.text+0x1989): undefined reference to mqttmessage_create_in_place 'iothubtransport_mqtt_common.c :( * text + 0x_t_t_t_0_t_063):/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client_mqtt_transport.a (iothubtransport_mqtt_common.co): в функции publish_device_method_message': iothubtransport_mqtt_common.c:(.text+0x1bc6): undefined reference to mqttmessage_create_in_place 'iothubtransport_mqtt_common.c :(. text + 0x1c32): неопределенная ссылка на mqtt_client_publish' iothubtransport_mqtt_common.c:(.text+0x1c93): undefined reference to mqttmessage_destroy / gus-764 / gux-ru../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.co): в функции publish_device_twin_get_message': iothubtransport_mqtt_common.c:(.text+0x1e65): undefined reference to mqttmessage_create 'iothubtransport_mqtt_common.c :(. text + 0x1ed4): неопределенная ссылка на 101)

Вот файл CMakelists.txt:

> cmake_minimum_required(VERSION 2.8.11)
set(AZUREIOT_INC_FOLDER ".." "/usr/include/azureiot")
include_directories(${AZUREIOT_INC_FOLDER})
set(my_c_files
        ./mqttsender.c
)

add_executable(mqttsender ${my_c_files})

target_link_libraries(mqttsender
        iothub_client
        iothub_client_mqtt_transport
        aziotsharedutil
        ssl
        pthread
        curl
        ssl
        crypto
        m
)

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include "iothub.h" //located at "/usr/include/azureiot/"
#include "iothubtransportmqtt.h" //for mqtt protocol types
#include "iothub_client.h"

int main()
{       int myrv;
        myrv = IoTHub_Init();
        char myconnectionstring[] = "blablablabla";
        printf("IoTHub_Init returns %d\n", myrv);
        if (IoTHubClient_LL_CreateFromConnectionString(myconnectionstring, MQTT_Protocol) == NULL)
        {
                (void)printf("ERROR: got no handle!\r\n");
        }
        else
        {
                (void)printf("INFORMATION: yeah, there is a handle!\n");
        }
        IoTHub_Deinit();
        printf("IoTHub_Deinit done.\n");
        return 0;
}

Спасибо.

1 Ответ

1 голос
/ 15 октября 2019

Один из шагов, который мне помог, - это добавить библиотеку parson в CMakeLists.txt. Просто добавили строку "parson" в раздел target_link_libraries. Другим шагом было добавить библиотеку umqtt в тот же раздел, вместо чего там ничего не было. "uamqp", как в примере, приведенном здесь: https://github.com/Azure/azure-iot-sdk-c/blob/master/doc/ubuntu_apt-get_sample_setup.md#create-an-application-using-cmake

Так что теперь мой CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 2.8.11)
set(AZUREIOT_INC_FOLDER ".." "/usr/include/azureiot" "/usr/include/azureiot/inc")
include_directories(${AZUREIOT_INC_FOLDER})
set(my_c_files
        ./mqttsender.c
)

add_executable(mqttsender ${my_c_files})

target_link_libraries(mqttsender
        iothub_client
        iothub_client_mqtt_transport
        umqtt
        aziotsharedutil
        ssl
        pthread
        curl
        ssl
        crypto
        m
        parson
)

И мой mqttclient может быть скомпилирован и правильно связан:)

Надеюсь, что это кому-нибудь поможет, а иногда и.

...