常见问题

编译问题

1. 编译出现undefined reference错误

[CC] HAL_OS_linux.o                     <= HAL_OS_linux.c                                    
[CC] HAL_TCP_linux.o                    <= HAL_TCP_linux.c                                    
[CC] HAL_Timer_linux.o                  <= HAL_Timer_linux.c                                    
[CC] HAL_TLS_mbedtls.o                  <= HAL_TLS_mbedtls.c                                    
[AR] libiot_platform.a                  <= HAL_OS_linux.o                                    
                                           HAL_TCP_linux.o
                                           HAL_Timer_linux.o
                                           HAL_TLS_mbedtls.o
/home/os/projects/ucloud/ucloud-iot-device-sdk-c-master/output/release/lib/libiot_platform.a(HAL_OS_linux.o): In function `HAL_UptimeMs':
HAL_OS_linux.c:(.text+0x102): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
make: *** [mqtt_sample] Error 1

错误分析

该问题是由于SDK的linux HAL层用到了linux librt实时库(real time),编译器找不到系统头文件,需要添加该库。

解决方法

修改文件:./tools/scripts/parsemakesettings.mk

将line32,35

CFLAGS  += -DFORCE_SSL_VERIFY -DENABLE_LOG_ERR -DENABLE_LOG_WARN -DENABLE_LOG_INFO
ifeq (debug,$(strip $(BUILD_TYPE)))
CFLAGS  += -DENABLE_LOG_DEBUG -DENABLE_IOT_TRACE
endif

修改为:

CFLAGS  += -DFORCE_SSL_VERIFY -DENABLE_LOG_ERR -DENABLE_LOG_WARN -DENABLE_LOG_INFO -lrt
ifeq (debug,$(strip $(BUILD_TYPE)))
CFLAGS  += -DENABLE_LOG_DEBUG -DENABLE_IOT_TRACE -lrt
endif

2. 编译出现g++ not found错误

[AR] libiot_platform.a                  <= HAL_OS_linux.o                                    
                                           HAL_TCP_linux.o
                                           HAL_Timer_linux.o
                                           HAL_TLS_mbedtls.o
mv mqtt_sample /home/os/projects/ucloud/ucloud-iot-device-sdk-c-master/output/release/bin
make[1]: g++: Command not found
make[1]: *** [lib] Error 127
make: *** [gtest] Error 2
os@os:~/projects/ucloud/ucloud-iot-device-sdk-c-master$ 

错误分析

ARM平台使用交叉编译时,需要添加编译器。 由于SDK使用了googletest框架作为用例测试,而googletest使用的是C++编写的,所以需要C++编译器。

解决方法

关闭googletest模块;

修改文件: ./make.settings

将line24

FEATURE_SDK_TESTS_ENABLED               = y     # 是否打开SDK测试用例编译

修改为:

FEATURE_SDK_TESTS_ENABLED               = n     # 是否打开SDK测试用例编译

3. 编译出现**C99**错误

[CC] mqtt_client_common.o               <= mqtt_client_common.c                                    
/root/ucloud/ucloud-iot-device-sdk-c/src/mqtt/src/mqtt_client_common.c: In function ‘_handle_suback_packet’:
/root/ucloud/ucloud-iot-device-sdk-c/src/mqtt/src/mqtt_client_common.c:925:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
     for (int j = 0; j <  count; j++) {
     ^
/root/ucloud/ucloud-iot-device-sdk-c/src/mqtt/src/mqtt_client_common.c:925:5: note: use option -std=c99 or -std=gnu99 to compile your code
make: *** [/root/ucloud/ucloud-iot-device-sdk-c/src/mqtt/src/mqtt_client_common.o] Error 1

错误分析

编译器不支持C99风格代码。

解决方法

添加C99支持。

修改文件: ./tools/scripts/parsemakesettings.mk

将line32,35

CFLAGS  += -DFORCE_SSL_VERIFY -DENABLE_LOG_ERR -DENABLE_LOG_WARN -DENABLE_LOG_INFO
ifeq (debug,$(strip $(BUILD_TYPE)))
CFLAGS  += -DENABLE_LOG_DEBUG -DENABLE_IOT_TRACE
endif

修改为:

CFLAGS  += -std=gnu99 -DFORCE_SSL_VERIFY -DENABLE_LOG_ERR -DENABLE_LOG_WARN -DENABLE_LOG_INFO
ifeq (debug,$(strip $(BUILD_TYPE)))
CFLAGS  += -std=gnu99 -DENABLE_LOG_DEBUG -DENABLE_IOT_TRACE
endif