Debian下Azure IoT SDK C自定义Makefile链接问题求助
问题
已在Debian系统上编译完成azure-iot-sdk-c,所有示例均可正常构建运行。现在尝试通过自定义Makefile创建可移植应用,将所需Azure库统一放入libs目录,但出现链接错误。该应用需在Azure IoT Hub完成设备预配并发送消息,代码直接取自prov_dev_client_sample,以下是当前Makefile及部分链接错误信息:
当前Makefile
CC = gcc CFLAGS = -g -Wall INC = -I./inc -I./inc/c-utility/inc -I./inc/iothub_client/inc -I./inc/umqtt/inc -I./inc/deps/umock-c/inc -I./inc/deps/azure-macro-utils-c/inc -I./inc/deps/azure-macro-utils-c/inc -I./inc/provisioning_client/inc -I./inc/provisioning_client/adapters LIBS = -L./libs -laziotsharedutil -liothub_client -liothub_client_mqtt_transport -liothub_client_http_transport -lprov_mqtt_transport -luhttp -lprov_device_client -lprov_device_ll_client -liothub_service_client -lumqtt -lprov_auth_client -lprov_http_transport -lhsm_security_client -lumock_c -luamqp -lprovisioning_service_client -lprov_mqtt_ws_transport -lprov_amqp_ws_transport -lprov_amqp_transport -liothub_client_amqp_ws_transport -liothub_client_amqp_transport -lparson -lserializer GENLIBS = -lm -lcrypto -luuid -lcurl -lpthread default: client client.o: client.c $(CC) -c client.c $(INC) -o client.o client: client.o $(CC) client.o $(CFLAGS) $(LIBS) $(GENLIBS) -o client
部分链接错误信息
gcc client.o -g -Wall -L./libs -laziotsharedutil -liothub_client -liothub_client_mqtt_transport -liothub_client_http_transport -lprov_mqtt_transport -luhttp -lprov_device_client -lprov_device_ll_client -liothub_service_client -lumqtt -lprov_auth_client -lprov_http_transport -lhsm_security_client -lumock_c -luamqp -lprovisioning_service_client -lprov_mqtt_ws_transport -lprov_amqp_ws_transport -lprov_amqp_transport -liothub_client_amqp_ws_transport -liothub_client_amqp_transport -lparson -lserializer -lm -lcrypto -luuid -lcurl -lpthread -o client /usr/bin/ld: ./libs/libiothub_client.a(iothub.c.o): in function `IoTHub_Init': iothub.c:(.text+0x9): undefined reference to `platform_init' /usr/bin/ld: ./libs/libiothub_client.a(iothub.c.o): in function `IoTHub_Deinit': iothub.c:(.text+0x72): undefined reference to `platform_deinit' /usr/bin/ld: ./libs/libiothub_client.a(iothub_client_core.c.o): in function `freeHttpWorkerThreadInfo': iothub_client_core.c:(.text+0xbe): undefined reference to `Lock_Deinit' ...(更多未定义引用错误)
解决方案
1. 缺失平台适配库
platform_init、platform_deinit、Lock_Deinit这类未定义引用,属于Azure IoT SDK的平台适配层接口。Debian系统编译SDK时会生成libaziotplatformutils.a或libplatform.a这类平台库,当前LIBS列表未包含,需要添加:
- 在LIBS中加入
-laziotplatformutils(对应libaziotplatformutils.a)或-lplatform,具体以你编译SDK后生成的库文件名为准。
2. 链接顺序错误
GCC链接器按从左到右的顺序解析依赖,依赖其他库的文件必须放在被依赖库的后方。当前LIBS顺序颠倒了依赖关系(比如liothub_client依赖laziotsharedutil,但前者被放在了后者前面),需要调整顺序,让依赖库出现在被依赖库之后。大致正确的顺序如下:
LIBS = -L./libs \ -lprov_device_client -lprov_device_ll_client \ -lprov_mqtt_transport -lprov_http_transport -lprov_amqp_transport \ -lprov_mqtt_ws_transport -lprov_amqp_ws_transport \ -lprov_auth_client -lhsm_security_client \ -liothub_client_mqtt_transport -liothub_client_http_transport -liothub_client_amqp_transport -liothub_client_amqp_ws_transport \ -liothub_client \ -lumqtt -luamqp -luhttp \ -lserializer -lparson \ -laziotsharedutil -laziotplatformutils \ -lumock_c
3. 移除不必要的库
当前LIBS包含了设备端不需要的服务端库(比如liothub_service_client、lprovisioning_service_client),移除这些冗余库可以减少链接复杂度,避免潜在依赖问题。
修正后的Makefile示例
CC = gcc CFLAGS = -g -Wall INC = -I./inc -I./inc/c-utility/inc -I./inc/iothub_client/inc -I./inc/umqtt/inc -I./inc/deps/umock-c/inc -I./inc/deps/azure-macro-utils-c/inc -I./inc/provisioning_client/inc -I./inc/provisioning_client/adapters # 调整库顺序、添加平台库、移除服务端冗余库 LIBS = -L./libs \ -lprov_device_client -lprov_device_ll_client \ -lprov_mqtt_transport \ -lprov_auth_client -lhsm_security_client \ -liothub_client_mqtt_transport \ -liothub_client \ -lumqtt \ -lserializer -lparson \ -laziotsharedutil -laziotplatformutils \ -lumock_c GENLIBS = -lm -lcrypto -luuid -lcurl -lpthread default: client client.o: client.c $(CC) -c client.c $(INC) -o client.o client: client.o $(CC) client.o $(CFLAGS) $(LIBS) $(GENLIBS) -o client
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

