Я следовал официальной документации и описанному здесь руководству 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;
}
Спасибо.