# C-SDK 编译方式及配置选项说明
本文档对C-SDK 的编译方式和编译配置选项进行说明,并介绍了 Linux和Windows 开发环境下面的编译环境搭建以及编译示例。
## C-SDK 编译方式说明
C-SDK 支持三种编译方式
#### 1. cmake 方式
推荐使用cmake作为跨平台的编译工具,支持在Linux和Windows开发环境下进行编译。
cmake方式采用CMakeLists.txt作为编译配置选项输入文件
#### 2. Makefile 方式
对不支持cmake的环境,使用Makefile直接编译的方式,该方式与SDK v3.0.3及之前的版本保持一致,采用make.settings作为编译配置选项输入文件,修改完成后执行make即可
#### 3. 代码抽取方式
该方式可根据需求选择功能,将相关代码抽取到一个单独的文件夹,文件夹里面的代码层次目录简洁,方便用户拷贝集成到自己的开发环境。
该方式需要依赖cmake工具,在CMakeLists.txt中配置相关功能模块的开关,并将EXTRACT_SRC置为ON,Linux环境运行以下命令
```
mkdir build
cd build
cmake ..
```
即可在output/qcloud_iot_c_sdk中找到相关代码文件,目录层次如下:
```
qcloud_iot_c_sdk
├── include
│ ├── config.h
│ ├── exports
├── platform
└── sdk_src
└── internal_inc
```
include目录为SDK供用户使用的API及可变参数,其中config.h为根据编译选项生成的编译宏。API具体介绍请参考**C-SDK_API及可变参数说明**。
platform目录为平台相关的代码,可根据设备的具体情况进行修改适配。具体的函数说明请参考文档**C-SDK_Porting跨平台移植概述**
sdk_src为SDK的核心逻辑及协议相关代码,一般不需要修改,其中internal_inc为SDK内部使用的头文件。
用户可将qcloud_iot_c_sdk拷贝到其目标平台的编译开发环境,并根据具体情况修改编译选项。
## C-SDK 编译选项说明
#### 1. 编译配置选项
以下配置选项大部分都适用于cmake和make.setting。cmake中的ON值对应于make.setting的y,OFF对应于n。
| 名称 | cmake值 | 说明 |
| :------------------------------- | ------------- | ------------------------------------------------------------ |
| BUILD_TYPE | release/debug | release:不启用IOT_DEBUG信息,编译输出到release目录下
debug:启用IOT_DEBUG信息,编译输出到debug目录下 |
| EXTRACT_SRC | ON/OFF | 代码抽取功能开关,仅对使用cmake有效 |
| COMPILE_TOOLS | gcc | 支持gcc和msvc,也可以是交叉编译器比如arm-none-linux-gnueabi-gcc |
| PLATFORM | linux | 包括linux/windows/freertos/nonos |
| FEATURE_MQTT_COMM_ENABLED | ON/OFF | MQTT通道总开关 |
| FEATURE_MQTT_DEVICE_SHADOW | ON/OFF | 设备影子总开关 |
| FEATURE_COAP_COMM_ENABLED | ON/OFF | CoAP通道总开关 |
| FEATURE_GATEWAY_ENABLED | ON/OFF | 网关功能总开关 |
| FEATURE_OTA_COMM_ENABLED | ON/OFF | OTA固件升级总开关 |
| FEATURE_OTA_SIGNAL_CHANNEL | MQTT/COAP | OTA信令通道类型 |
| FEATURE_AUTH_MODE | KEY/CERT | 接入认证方式 |
| FEATURE_AUTH_WITH_NOTLS | ON/OFF | OFF: TLS使能, ON: TLS关闭 |
| FEATURE_DEV_DYN_REG_ENABLED | ON/OFF | 设备动态注册开关 |
| FEATURE_LOG_UPLOAD_ENABLED | ON/OFF | 日志上报开关 |
| FEATURE_EVENT_POST_ENABLED | ON/OFF | 事件上报开关 |
| FEATURE_DEBUG_DEV_INFO_USED | ON/OFF | 设备信息获取来源开关 |
| FEATURE_SYSTEM_COMM_ENABLED | ON/OFF | 获取后台时间开关 |
| FEATURE_AT_TCP_ENABLED | ON/OFF | AT模组TCP功能开关 |
| FEATURE_AT_UART_RECV_IRQ | ON/OFF | AT模组中断接受功能开关 |
| FEATURE_AT_OS_USED | ON/OFF | AT模组多线程功能开关 |
| FEATURE_AT_DEBUG | ON/OFF | AT模组调试功能开关 |
| FEATURE_MULTITHREAD_TEST_ENABLED | ON/OFF | 是否编译Linux多线程测试例程 |
配置选项之间存在依赖关系,当依赖选项的值为有效值时,部分配置选项才有效,主要如下:
| 名称 | 依赖选项 | 有效值 |
| :------------------------------- | ------------------------------------------------------- | ------------ |
| FEATURE_MQTT_DEVICE_SHADOW | FEATURE_MQTT_COMM_ENABLED | ON |
| FEATURE_GATEWAY_ENABLED | FEATURE_MQTT_COMM_ENABLED | ON |
| FEATURE_OTA_SIGNAL_CHANNEL(MQTT) | FEATURE_OTA_COMM_ENABLED
FEATURE_MQTT_COMM_ENABLED | ON
ON |
| FEATURE_OTA_SIGNAL_CHANNEL(COAP) | FEATURE_OTA_COMM_ENABLED
FEATURE_COAP_COMM_ENABLED | ON
ON |
| FEATURE_AUTH_WITH_NOTLS | FEATURE_AUTH_MODE | KEY |
| FEATURE_AT_UART_RECV_IRQ | FEATURE_AT_TCP_ENABLED | ON |
| FEATURE_AT_OS_USED | FEATURE_AT_TCP_ENABLED | ON |
| FEATURE_AT_DEBUG | FEATURE_AT_TCP_ENABLED | ON |
#### 2. 设备信息选项
在腾讯云物联控制台创建设备之后,需要将设备信息(ProductID/DeviceName/DeviceSecret/Cert/Key文件)配置在SDK中才能正确运行。在开发阶段,SDK 提供两种方式存储设备信息:
1. 存放在代码中(编译选项DEBUG_DEV_INFO_USED = ON),则在`platform/os/xxx/HAL_Device_xxx.c`中修改设备信息,在无文件系统的平台下可以使用这种方式。
2. 存放在配置文件中(编译选项DEBUG_DEV_INFO_USED = OFF),则在`device_info.json`文件修改设备信息,此方式下更改设备信息不需重新编译SDK,在Linux/Windows平台下开发推荐使用这种方式。
## C-SDK 编译环境
### Linux(Ubuntu)环境
本文使用Ubuntu的版本为14.04或16.04
1. 必要软件安装
```
$ sudo apt-get install -y build-essential make git gcc cmake
```
SDK需要cmake版本在3.5以上,默认安装的cmake版本较低,可以参考如下链接进行cmake特定版本的下载与安装
下载链接:https://cmake.org/download/
安装参考:https://gitlab.kitware.com/cmake/cmake
2. 配置修改
修改CMakeLists.txt确保以下选项存在(以密钥认证设备为例)
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
3. 执行脚本编译
完整编译库和示例
```
./cmake_build.sh
```
输出的库文件,头文件及示例在`output/release`文件夹中。
在一次完整编译之后,若只需要编译示例,则执行
```
./cmake_build.sh samples
```
4. 填写设备信息
将在腾讯云物联网平台创建的设备的设备信息(以**密钥认证设备**为例)填写到device_info.json中,如:
```
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"deviceName":"test_device",
"key_deviceinfo":{
"deviceSecret":"vX6PQqazsGsMyf5SMfs6OA6y"
}
```
5. 运行示例
示例输出位于`output/release/bin`文件夹中,比如运行data_template_sample示例,输入`./output/release/bin/data_template_sample`即可。
### Windows环境
#### 获取和安装Visio Studio 2019开发环境
请访问[Visual Studio下载网站](https://visualstudio.microsoft.com/zh-hans/downloads/),下载并安装Visio Studio 2019,本文档下载安装的是16.2版本 Community。
![](https://main.qcloudimg.com/raw/730f793e3166db859682cdbfd0c7181f.jpg)
然后选择**使用C++的桌面开发**,并确保勾选**用于Windows的C++ CMAKE工具**:
![](https://main.qcloudimg.com/raw/89a63cb6ae5231a66b17e80acac37267.jpg)
#### 编译并运行
1. 运行visual studio,选择**打开本地文件夹**,并选择下载的C SDK目录。
![](https://main.qcloudimg.com/raw/f0c65e7c5ce13ca13b967c178c0449c6.jpg)
2. [修改用户信息]()
3. 双击打开根目录的CMakeLists.txt,并确认编译工具链中设置的平台为**windows**和编译工具为**MSVC**(其他配置选项请参考[cmake编译配置与代码抽取]())。
![](https://main.qcloudimg.com/raw/8a16723698646a2dca5ab08a57927304.jpg)
```cmake
# 编译工具链
#set(COMPILE_TOOLS "gcc")
#set(PLATFORM "linux")
set(COMPILE_TOOLS "MSVC")
set(PLATFORM "windows")
```
4. visual studio会自动生成cmake缓存,请等待cmake缓存生成完毕。
![](https://main.qcloudimg.com/raw/633bf217afc2d52e92618a90bd7d9da0.jpg)
5. 缓存生成完毕后,点击**生成->全部生成**。
![](https://main.qcloudimg.com/raw/f85d2435c49a802eedd87b751408ecce.jpg)
6. 选择相应的示例运行,示例应与用户信息相对应。
![](https://main.qcloudimg.com/raw/a0f2bacc0d31d2da9d327d5c855655a3.jpg)