C语言 链接非常简单的MQTT客户端(Azure IOT Hub SDK)时出现问题



>我遵循了此处描述的官方文档和MS Azure IOT SDK for C指南。

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

构建我非常简单的自己的客户端来发送 MQTT 消息。但是在 ubuntu 机器上,我无法让这个客户端工作。编译和链接是通过cmake和make完成的。 但是make VERBOSE=1命令在"未定义的引用"错误中运行(请参见屏幕截图(。我认为通过 apt-get 安装 SDK 后,系统中所有库都可用。但现在看来,有些不见了。您能否给我一个关于缺少哪些库的信息,或者找出哪些不存在的方法(也许一个是 parson lib(? 这是 make/linker 输出(只有更多行中的某些行(:

/

usr/bin/cmake -E cmake_link_script CMakeFiles/mqttsender.dir/link.txt --verbose=1/usr/bin/cc -rdynamic CMakeFiles/mqttsender.dir/mqttsender.c.o -o mqttsender -liothub_client -liothub_client_mqtt_transport -laziotsharedutil -lssl -lpthread -lcurl -lssl -lcrypto -lm -lpthread -lcurl -lcrypto -lm/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client.a(iothub_client_ll_uploadtoblob.c.o(:在函数parse_result_json': iothub_client_ll_uploadtoblob.c:(.text+0x334): undefined reference tojson_parse_string'"/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.c.o(:在函数free_transport_handle_data': iothubtransport_mqtt_common.c:(.text+0x1e0): undefined reference tomqtt_client_deinit'/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.c.o(:在函数publish_mqtt_telemetry_msg': iothubtransport_mqtt_common.c:(.text+0x1989): undefined reference tomqttmessage_create_in_place' iothubtransport_mqtt_common.c:(.text+0x1a63(:未定义对mqtt_client_publish' iothubtransport_mqtt_common.c:(.text+0x1ad8): undefined reference tomqttmessage_destroy的引用/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.c.o(:在函数publish_device_method_message': iothubtransport_mqtt_common.c:(.text+0x1bc6): undefined reference tomqttmessage_create_in_place' iothubtransport_mqtt_common.c:(.text+0x1c32(:未定义对mqtt_client_publish' iothubtransport_mqtt_common.c:(.text+0x1c93): undefined reference tomqttmessage_destroy的引用/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libiothub_client_mqtt_transport.a(iothubtransport_mqtt_common.c.o(:在函数publish_device_twin_get_message': iothubtransport_mqtt_common.c:(.text+0x1e65): undefined reference tomqttmessage_create' iothubtransport_mqtt_common.c:(.text+0x1ed4(:对mqtt_client_publish' iothubtransport_mqtt_common.c:(.text+0x1f52): undefined reference tomqttmessage_destroy的未定义引用">

以下是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 %dn", myrv);
if (IoTHubClient_LL_CreateFromConnectionString(myconnectionstring, MQTT_Protocol) == NULL)
{
(void)printf("ERROR: got no handle!rn");
}
else
{
(void)printf("INFORMATION: yeah, there is a handle!n");
}
IoTHub_Deinit();
printf("IoTHub_Deinit done.n");
return 0;
}

谢谢。

有帮助的一个步骤是在CMakeLists.txt中添加parson库。刚刚在target_link_libraries部分添加了"parson"行。 另一个步骤是在同一部分中添加 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 可以编译并正确链接:)

希望这会帮助某人,有时。

最新更新