构建配置说明

更新时间:2018-10-23 21:18:41

目前设备端C-SDK的构建配置系统支持以下的编译方式

  • Linux上以GNU Make + 各种工具链编译, 产生各种嵌入式目标架构的SDK, 本章将演示

    • GNU Make + gcc, 产生适用于 64位Linux 的SDK以及可执行例程
    • GNU Make + gcc, 产生适用于 32位Linux 的SDK以及可执行例程
    • GNU Make + i686-w64-mingw32-gcc, 产生适用于 Windows 平台的SDK以及可执行例程
    • GNU Make + arm-none-eabi-gcc, 产生适用于 MK3060/MK3080 嵌入式平台的SDK
    • GNU Make + xtensa-lx106-elf-gcc, 产生适用于 ESP8266 嵌入式平台的SDK
    • GNU Make + arm-linux-gnueabihf-gcc, 产生适用于 arm-linux 嵌入式平台的SDK
  • Linux上以cmake + 各种工具链编译, 产生各种目标架构的SDK, 本章将演示

    • cmake + gcc, 产生适用于 64位Linux 的SDK
    • cmake + gcc, 产生适用于 32位Linux 的SDK
    • cmake + arm-linux-gnueabihf-gcc, 产生适用于 arm-linux 嵌入式平台的SDK
    • cmake + i686-w64-mingw32-gcc, 产生适用于 Windows 平台的SDK

未来可能支持以下的编译方式

  • Windows上以Keil IDE编译, 产生适用于 ARM 嵌入式平台的SDK

  • Windows上以IAR IDE编译, 产生适用于 ARM 嵌入式平台的SDK

  • Windows上以cmake + mingw32编译, 产生适用于 Windows 平台的SDK

  • Windows上以VS Code 2017编译, 产生适用于 Windows 平台的SDK

  • Windows上以QT Creator编译, 产生适用于 Windows 平台的SDK

  • Windows上以Visual Studio 2017编译, 产生适用于 Windows 平台的SDK

目前设备端C-SDK的构建配置系统的配置/裁剪接口是由以下三者组合提供

  • 硬件平台维度: src/board/config.xxx.yyy, 这些文件在下文中, 也称 config 文件

  • 功能模块维度: make.settings

  • 资源伸缩维度: include/imports/iot_import_config.h

本章先说明编译系统及其 config 文件的语法, 接着说明配置相关的文件 make.settings 的用法, 介绍在平台选定之后, 如何裁剪和配置功能

再演示如何交叉编译到嵌入式目标平台和不交叉的编译 Linux/Windows 主机 demo 版本

最后介绍了跨平台的 cmake 编译系统, 它接受配置的地方仍是 make.settings 文件, 但可适用于更多的开发环境

基于 make 的编译系统详解

常用命令

命令 解释
make distclean 清除一切构建过程产生的中间文件, 使当前目录仿佛和刚刚clone下来一样
make [all] 使用默认的平台配置文件开始编译
make env 显示当前编译配置, 非常有用, 比如可显示交叉编译链, 编译CFLAGS等
make reconfig 弹出多平台选择菜单, 用户可按数字键选择, 然后根据相应的硬件平台配置开始编译
make config 显示当前被选择的平台配置文件
make menuconfig 以图形化的方式编辑和生成功能配置文件make.settings
make help 打印帮助文本
make <directory> 单独编译被指定的目录, 或者叫构建单元
make test 运行指定的测试集程序, 统计显示测试例的通过率和源代码的覆盖率

输出说明

成功编译的话, 最终会打印类似如下的表格, 这是每个模块的ROM占用, 以及静态RAM占用的统计


| RATE  | MODULE NAME                         | ROM       | RAM       | BSS        | DATA   |
|-------|-------------------------------------|-----------|-----------|------------|--------|
| 27.5% | src/services/linkkit/dm             | 58954     | 172       | 160        | 12     |
| 19.5% | src/protocol/alcs                   | 41961     | 213       | 189        | 24     |
| 11.3% | src/infra/utils                     | 24335     | 284       | 264        | 20     |
| 10.3% | src/services/awss                   | 22253     | 1012      | 1000       | 12     |
| 9.75% | src/protocol/mqtt                   | 20888     | 32        | 20         | 12     |
| 7.95% | src/services/linkkit/cm             | 17026     | 79        | 79         | 0      |
| 4.46% | src/services/ota                    | 9563      | 0         | 0          | 0      |
| 4.10% | src/services/dev_bind               | 8792      | 214       | 214        | 0      |
| 2.24% | src/infra/system                    | 4801      | 1480      | 1404       | 76     |
| 1.75% | src/sdk-impl                        | 3750      | 8         | 8          | 0      |
| 0.62% | src/infra/log                       | 1334      | 268       | 0          | 268    |
| 0.39% | src/services/dev_reset              | 856       | 10        | 10         | 0      |
|-------|-------------------------------------|-----------|-----------|------------|--------|
|  100% | - IN TOTAL -                        | 214513    | 3772      | 3348       | 424    |

用户需要关注的输出产物都在 output/release 目录下:

output/release/lib

产物文件名 说明
libiot_hal.a HAL接口层的参考实现, 提供了 HAL_XXX() 接口
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口
libiot_tls.a 裁剪过的 mbedtls, 提供了 mbedtls_xxx() 接口, 支撑 libiot_hal.a

output/release/include

产物文件名 说明
iot_import.h 列出所有需要C-SDK的用户提供给SDK的底层支撑接口, 详见 第六章 HAL说明 部分
iot_export.h 列出所有C-SDK向用户提供的底层API编程接口, 详见 第七章 API说明 部分

output/release/bin

如果是在主机环境下不做交叉编译(Ubuntu/Windows), 是可以产生主机版本的demo程序, 可以直接运行的, 比如

产物文件名 说明
linkkit-example-solo 高级版的例程, 可演示 linkkit_xxx() 接口的使用
mqtt-example 基础版的例程, 可演示 IOT_XXX() 接口的使用

组成部分

用户输入

设备端C-SDK的构建配置系统, 有以下三个输入文件可接受用户的配置, 您可以通过编辑它们, 将配置输入到构建系统中

  • 功能配置文件: 即顶层目录的 make.settings 文本文件

  • 平台配置文件: 即目录 src/board 下的 config.xxx.yyy 系列文件, 也称config文件

  • 伸缩配置文件:include/imports/iot_import_config.h 文件


构建系统最终是依据 config.xxx.yyy 文件进行编译, 然而由于功能配置/裁剪更为常用, 我们将它额外抽取到了 make.settings

config.xxx.yyy 主要关注目标嵌入式硬件平台的工具链程序和编译/链接选项的指定, 用于跨平台移植

config.xxx.yyy 此外也能以 CONFIG_ENV_CFLAGS += ... 的语法新增自定义 CFLAGS, 覆盖 iot_import_config.h 中列出的可配置选项

make.settings 则是在已被确定的目标硬件平台上, 专注于C-SDK的功能模块裁剪或者配置, 用于裁剪功能模块

iot_import_config.h 是接着对已被确定的功能, 列出"资源耗费"方面, 伸缩性质的可配置项, 如时间长度/内存大小/重试次数/线程多少/日志简繁等

构建单元

从工程顶层目录以下, 每一个含有iot.mk的子目录, 都被构建系统认为是一个构建单元

每一个构建单元, 若相对顶级makefile的路径是bar, foo/bar1, 则可以用make bar, make foo/bar1这样的命令单独编译

makefile

构建系统是基于GNU Make的, 所以它工作过程的起点是顶层目录的makefile文件

build-rules

构建系统核心, 指定编译的规则, 用户不需要关注, 也不应去修改

project.mk

指定目录排布, 工程名称, 版本信息等

src/board/config.xxx.yyy

文件名形式为config.<VENDOR>.<MODEL>的文本文件, 会被构建系统认为是硬件平台配置文件, 每个文件对应一个嵌入式软硬件平台

  • 其中部分, 一般是指明嵌入式平台的软件OS提供方, 如mxchip, ubuntu, win7等. 另外, 这也会导致构建系统到$(IMPORT_DIR)/<VENDOR>目录下寻找预编译库的二进制库文件和头文件

  • 其中部分, 一般是标明嵌入式平台的具体硬件型号, 如mtk7687, qcom4004等, 不过也可以写上其它信息, 因为构建系统不会去理解它, 比如mingw32, x86-64

例如config.mxchip.3080c文件, 如果在make reconfig的时候被选择, 则会导致:

  • 构建系统在import/mxchip/目录下寻找预编译库的二进制库文件和头文件

  • 构建系统使用该文件内的变量指导编译行为, 具体来说, 可以根据说明使用如下变量

src/xxx/yyy/iot.mk

指导构建系统如何构建本单元 xxx/yyy 的makefile片段文件

调试方式

  • make ...命令行中, 设置TOP_Q变量为空, 可打印工程顶层的执行逻辑, 例如硬件平台的选择, SDK主库的生成等

        make .... TOP_Q=
    
  • make ...命令行中, 设置Q变量为空, 可打印模块内部的构建过程, 例如目标文件的生成, 头文件搜寻路径的组成等

        make .... Q=
    
  • 可以用make foo/bar单独对foo/bar进行构建, 不过, 这可能需要先执行make reconfig

  • 可以进入.O/foo/bar路径, 看到完整的编译临时目录, 有makefile和全部源码, 所以在这里执行make, 效果和make foo/bar等同

config.xxx.yyy 文件详解

交叉编译相关

变量 说明
CONFIG_ENV_CFLAGS 指定全局的CFLAGS编译选项, 传给compiler, 例如CONFIG_ENV_CFLAGS += -DDEBUG
CONFIG_ENV_LDFLAGS 指定全局的LDFLAGS链接选项, 传给linker, 例如CONFIG_ENV_LDFLAGS += -lcrypto
CROSS_PREFIX 指定交叉编译工具链共有的前缀, 例如CROSS_PREFIX := arm-none-eabi-, 会导致构建系统使用arm-none-eabi-gccarm-none-eabi-ar, 以及arm-none-eabi-strip
OVERRIDE_CC 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armcc, 可用OVERRIDE_CC = armcc单独指定C编译器
OVERRIDE_AR 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armar, 可用OVERRIDE_AR = armar单独指定库压缩器
OVERRIDE_STRIP 当交叉工具链没有共有的前缀或者前缀不符合prefix+gcc/ar/strip类型时, 例如armcc没有对应的strip程序, 可用OVERRIDE_STRIP = true单独指定strip程序不执行
CONFIG_LIB_EXPORT 指定SDK产生的二进制库的形式, 例如`CONFIG\_LIB\_EXPORT := dynamic可以指定产生linux上的libiot\_sdk.so动态库文件, 默认为产生跨平台的libiot\_sdk.a静态库

目录文件相关

变量 说明
CONFIG_mmm/nnn 指定mmm/nnn目录是否需要编译的开关, 例如CONFIG_mmm/nnn :=的写法会导致该目录被跳过编译

资源耗费相关

文件 include/imports/iot_import_config.h 是 SDK 的内部文件, 用户不应直接修改这个文件

它的使命是在目标硬件平台确定, 以及C-SDK内容功能确定之后, 进行"资源耗费"方面的伸缩性质的配置, 如时间长度/内存大小/重试次数/线程多少/日志简繁等


之所以会对该文件进行说明, 是因为可用的配置项都在这个文件中列出, 对这些配置项的值, 正确的调整方式是在 config 文件中, 以 CONFIG_ENV_CFLAGS 操作, 例如

src/board/config.ubuntu.x86 文件中的如下段落:

CONFIG_ENV_CFLAGS   += \
    -DCONFIG_HTTP_AUTH_TIMEOUT=500 \
    -DCONFIG_MID_HTTP_TIMEOUT=500 \
    -DCONFIG_GUIDER_AUTH_TIMEOUT=500 \
    -DCONFIG_MQTT_RX_MAXLEN=5000 \
    -DCONFIG_MQTT_SUBTOPIC_MAXNUM=65535 \
    -DCONFIG_MBEDTLS_DEBUG_LEVEL=0 \

以下说明当前比较常用的配置项

CONFIG_MBEDTLS_DEBUG_LEVEL

  • 调整在TLS连接过程中, 调试日志打印的详细程度

  • 可配置的值从 010, 数字越大, 打印越详细, 数字为 0 表示不打印调试信息

  • 起作用的源码目录在 src/ref-impl/tls

CONFIG_MQTT_TX_MAXLEN

  • 调整在高级版中, 通信模块为MQTT上行报文所开辟的常驻内存缓冲区长度

  • 可配置的值为整数, 建议5122048, 过小会导致上行报文不够空间组装, 过大会导致设备上RAM资源消耗增大

  • 起作用的源码目录在 src/services/linkkit

CONFIG_MQTT_RX_MAXLEN

  • 调整在高级版中, 通信模块为MQTT上行报文所开辟的常驻内存缓冲区长度

  • 可配置的值为整数, 建议5122048, 过小会导致上行报文不够空间组装, 过大会导致设备上RAM资源消耗增大

  • 起作用的源码目录在 src/services/linkkit

用 make.settings 文件裁剪 C-SDK 详解

对V2.3.0以上版本, 可以用 make menuconfig 命令图形化的编辑 make.settings 文件

image | left

解压之后, 打开功能配置文件 make.settings, 根据需要编辑配置项, 使用不同的编译配置, 编译输出的SDK内容以及examples都有所不同

默认的配置状态为

FEATURE_MQTT_COMM_ENABLED    = y          # 是否打开MQTT通道的总开关
FEATURE_MQTT_DIRECT          = y          # 是否打开MQTT直连的分开关
FEATURE_OTA_ENABLED          = y          # 是否打开固件升级功能的分开关
FEATURE_DEVICE_MODEL_ENABLED = y          # 是否打开高级版功能的总开关
FEATURE_DEVICE_MODEL_GATEWAY = n          # 是否产生高级版网关SDK的分开关
FEATURE_WIFI_PROVISION_ENABLED = y        # 是否打开WiFi配网功能的开关
FEATURE_SUPPORT_TLS          = y          # 选择TLS安全连接的开关, 此开关与iTLS开关互斥
FEATURE_SUPPORT_ITLS         = n          # 选择iTLS安全连接的开关, 此开关与TLS开关互斥, 使能ID2时需打开此开关

除此以外, 即使并未出现在默认 make.settings 文件中的选项, 只要在以下的列表中, 也仍然可以被添加到 make.settings 文件

FEATURE_ALCS_ENABLED

  • 本地通信功能开关, 所谓本地通信是指搭载了C-SDK的嵌入式设备和手机app之间的局域网直接通信, 而不经过因特网和阿里云服务器中转

  • 可取的值是 y 或者 n

  • 它依赖其它的 FEATURE_DEVICE_MODEL_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/protocol/alcs

FEATURE_COAP_COMM_ENABLED

  • CoAP上云功能开关, 所谓CoAP上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 CoAP 协议进行连接和交互

  • 可取的值是 y 或者 n

  • 它不依赖其它的 FEATURE_XXX

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/protocol/coap

FEATURE_DEPRECATED_LINKKIT

  • 高级版接口风格的开关, 配置进行高级版物模型相关的编程时, C-SDK是提供 linkkit_xxx_yyy() 风格的旧版接口, 还是提供 IOT_Linkkit_XXX() 风格的新版接口

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_DEVICE_MODEL_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/sdk-impl

FEATURE_DEV_BIND_ENABLED

V2.3.0之后的版本才新增的这个开关

  • 绑定功能的开关, 只有用C-SDK连接飞燕平台的客户才需要关注并打开它, 用于使能设备被飞燕的公版app控制, 可绑定设备和用户账号

  • 可取的值是 y 或者 n

  • 它依赖其它的 FEATURE_DEVICE_MODEL_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/services/linkkit/dev_bind

FEATURE_DEVICE_MODEL_GATEWAY

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_ENHANCED_GATEWAY

  • 高级版网关能力的开关, 配置进行高级版物模型相关的编程时, C-SDK是提供 linkkit_xxx_yyy() 风格的单品接口, 还是提供 linkkit_gateway_xxx_yyy() 风格的网关接口

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_DEVICE_MODEL_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/services/linkkit/dm

FEATURE_HTTP2_COMM_ENABLED

  • HTTP2上云功能开关, 所谓HTTP2上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 HTTP2 协议进行连接和交互

  • 可取的值是 y 或者 n

  • 它不依赖其它的 FEATURE_XXX

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/protocol/http2

FEATURE_HTTP_COMM_ENABLED

  • HTTP/S上云功能开关, 所谓HTTP/S上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 HTTP 协议或 HTTPS 协议进行连接和交互

  • 可取的值是 y 或者 n

  • 它不依赖其它的 FEATURE_XXX

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/protocol/http

FEATURE_MQTT_COMM_ENABLED

  • MQTT上云功能开关, 所谓MQTT上云是指搭载了C-SDK的嵌入式设备和阿里云服务器之间使用 MQTT 协议进行连接和交互

  • 可取的值是 y 或者 n

  • 它不依赖其它的 FEATURE_XXX

  • 它被以下 FEATURE_XXX 所依赖, 是它们必需的前提

    • FEATURE_MQTT_DIRECT
    • FEATURE_MQTT_SHADOW
    • FEATURE_SUBDEVICE_ENABLED
    • FEATURE_WIFI_PROVISION_ENABLED
    • FEATURE_DEVICE_MODEL_ENABLED
  • 对应的源码目录是 src/protocol/mqtt

FEATURE_MQTT_DIRECT

  • MQTT直连功能开关, 所谓MQTT直连是指设备和阿里云服务器之间使用 MQTT 协议进行连接, 而不会前置基于 HTTP 协议认证的交互过程

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_MQTT_COMM_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/infra/system

FEATURE_MQTT_SHADOW

  • MQTT设备影子开关, 所谓MQTT设备影子是指设备在阿里云服务器之间上以JSON文档保留一份设备数据的镜像

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_MQTT_COMM_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/services/shadow

FEATURE_OTA_ENABLED

  • 固件升级功能开关, 所谓固件升级是指设备从阿里云服务器上下载用户在IoT控制台中上传的固件文件功能

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_MQTT_COMM_ENABLED 或者 FEATURE_COAP_COMM_ENABLED 的值是 y

  • 对应的源码目录是 src/services/ota

FEATURE_DEVICE_MODEL_ENABLED

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_SDK_ENHANCE

  • 高级版物模型能力的功能开关, 所谓高级版物模型能力是指设备可使用基于服务/属性/事件三要素的Alink协议和服务端通信

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_MQTT_COMM_ENABLED 的值是 y

  • 它被 FEATURE_DEVICE_MODEL_GATEWAY 所依赖

  • 对应的源码目录是 src/services/linkkit

FEATURE_SUBDEVICE_ENABLED

  • 旧版子设备管理能力的功能开关, 所谓子设备管理能力是指设备可代理其它不具有直接连云通道的设备, 上报和接收MQTT消息

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_MQTT_COMM_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/services/subdev

FEATURE_SUPPORT_ITLS

FEATURE_SUPPORT_TLS

  • 在TLS层是否使用iTLS的功能开关, 所谓iTLS是阿里巴巴基于ID2商业产品提供的特有闭源安全连接协议

  • 可取的值是 y 或者 n, FEATURE_SUPPORT_ITLSFEATURE_SUPPORT_TLS 的取值必须不同

  • 它不依赖其它的 FEATURE_XXX

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/ref-impl/hal

FEATURE_WIFI_PROVISION_ENABLED

在V2.3.0以前的版本中, 这个开关的曾用名是 FEATURE_WIFI_AWSS_ENABLED

  • WiFi配网的功能开关, 所谓WiFi配网是阿里巴巴自研的一种从手机app发送WiFi网络的SSID和密码给设备端的通信协议

  • 可取的值是 y 或者 n

  • 它依赖于 FEATURE_ALCS_ENABLED 的值是 y

  • 它不是其它 FEATURE_XXX 的依赖之一

  • 对应的源码目录是 src/services/awss

典型产品的 make.settings 示例

解压之后, 打开功能配置文件 make.settings, 根据需要编辑配置项, 使用不同的编译配置, 编译输出的SDK内容以及examples都有所不同

以下针对C-SDK的客户中, 较多出现的几种产品形态, 给出典型的配置文件, 并在注释中说明为什么这样配置

注: 2.2.1版本中若要使用WiFi配网功能, 请将 FEATURE_WIFI_AWSS_ENABLED = y 一行放置为 make.setting 的第一个配置项, 否则会工作异常

不具有网关功能的WiFi模组

这种场景下客户使用WiFi上行的MCU模组, 比如乐鑫ESP8266, 庆科MK3060等.

这种场景下, 设备和阿里云直接的连接只用于它自己和云端的通信, 不会用于代理给其它嵌入式设备做消息上报和指令下发或固件升级等.

FEATURE_MQTT_COMM_ENABLED    = y          # 一般WiFi模组都有固定供电, 所以都采用MQTT的方式上云
FEATURE_MQTT_DIRECT          = y          # MQTT直连效率更高, 该选项只在部分海外设备上才会关闭
FEATURE_OTA_ENABLED          = y          # 一般WiFi模组的客户, 都会使用阿里提供的固件升级服务
FEATURE_DEVICE_MODEL_ENABLED = y          # 一般WiFi模组片上资源充足, 可以容纳高级版, 所以打开
FEATURE_DEVICE_MODEL_GATEWAY = n          # 如上述说明, 不具备高级版网关功能的场景, 当然关闭这个选项
FEATURE_WIFI_PROVISION_ENABLED = y        # 一般WiFi模组的客户, 都会使用阿里的配网app或sdk, 告诉模组SSID和密码
FEATURE_SUPPORT_TLS          = y          # 绝大多数的客户都是用标准的TLS协议连接公网
FEATURE_SUPPORT_ITLS         = n          # 阿里私有的iTLS标准和TLS是互斥的, 上面把TLS打开了, 这里必须关闭

具有网关功能的WiFi模组

这种场景下客户使用WiFi上行的MCU模组, 比如庆科MK3080等.

这种场景下, 设备和阿里云直接的连接不仅用于它自己和云端的通信, 还会用于代理给其它嵌入式设备做消息上报和指令下发或固件升级等.

FEATURE_MQTT_COMM_ENABLED    = y          # 一般WiFi模组都有固定供电, 所以都采用MQTT的方式上云
FEATURE_MQTT_DIRECT          = y          # MQTT直连效率更高, 该选项只在部分海外设备上才会关闭
FEATURE_OTA_ENABLED          = y          # 一般WiFi模组的客户, 都会使用阿里提供的固件升级服务
FEATURE_DEVICE_MODEL_ENABLED = y          # 一般WiFi模组片上资源充足, 可以容纳高级版, 所以打开
FEATURE_DEVICE_MODEL_GATEWAY = y          # 如上述说明, 要具备高级版网关功能的场景, 当然打开这个选项
FEATURE_WIFI_PROVISION_ENABLED = y        # 一般WiFi模组的客户, 都会使用阿里的配网app或sdk, 告诉模组SSID和密码
FEATURE_SUPPORT_TLS          = y          # 绝大多数的客户都是用标准的TLS协议连接公网
FEATURE_SUPPORT_ITLS         = n          # 阿里私有的iTLS标准和TLS是互斥的, 上面把TLS打开了, 这里必须关闭

GSM模组

这种场景下设备直接连接2G网络

FEATURE_MQTT_COMM_ENABLED    = y          # 虽然CoAP更省电, 但不能做云端消息的及时下推, 所以目前GSM模组仍主要用MQTT的方式上云
FEATURE_MQTT_DIRECT          = y          # MQTT直连效率更高, 对网络远慢于WiFi的GSM模组而言, 直连开关必须打开
FEATURE_OTA_ENABLED          = y          # 一般GSM模组的客户, 也会使用阿里提供的固件升级服务
FEATURE_DEVICE_MODEL_ENABLED = n          # GSM模组网速很慢, 资源较少, 所以这种模组的客户一般不会用高级版, 而只需要基础版的MQTT上云
FEATURE_DEVICE_MODEL_GATEWAY = n          # GSM模组一般不集成高级版(物模型)功能, 并且它也不会下联其它嵌入式设备分享MQTT上云通道
FEATURE_WIFI_PROVISION_ENABLED = n        # GSM模组不通过WiFi协议连接公网, 因此关闭WiFi配网的开关
FEATURE_SUPPORT_TLS          = y          # 绝大多数的客户都是用标准的TLS协议连接公网, 对GSM模组, 甚至可能连这个选项都关闭
FEATURE_SUPPORT_ITLS         = n          # GSM模组有不少是做不加密通信(FEATURE_SUPPORT_TLS = n), 有加密也是走TLS, 所以ITLS都是关闭的

基于Linux系统的网关

比如家庭网关, 工业网关等, 一般是相对MCU模组来说, 性能强大的多, 资源丰富的多的设备

FEATURE_MQTT_COMM_ENABLED    = y          # 一般Linux网关都有固定供电, 所以都采用MQTT的方式上云
FEATURE_MQTT_DIRECT          = y          # MQTT直连效率更高, 该选项只在部分海外设备上才会关闭
FEATURE_OTA_ENABLED          = y          # 一般Linux网关的客户, 都会使用阿里提供的固件升级服务
FEATURE_DEVICE_MODEL_ENABLED = y          # 一般Linux网关片上资源充足, 可以容纳高级版, 所以打开
FEATURE_DEVICE_MODEL_GATEWAY = y          # 如上述说明, 要具备高级版网关功能的场景, 当然打开这个选项
FEATURE_WIFI_PROVISION_ENABLED = y        # 取决于Linux网关是否用WiFi做上行并使用阿里的配网app/sdk, 如果皆是, 则打开这个选项
FEATURE_SUPPORT_TLS          = y          # 绝大多数的客户都是用标准的TLS协议连接公网
FEATURE_SUPPORT_ITLS         = n          # 阿里私有的iTLS标准和TLS是互斥的, 上面把TLS打开了, 这里必须关闭

基于 make 编译到主机例程

本节的示例适用于开发者的开发环境是 Ubuntu16.04 的Linux主机的情况

这些例子都是在64位主机上的执行情况, 推荐您和阿里开发者一样, 安装64位的操作系统

用 make 为64位Linux编译

希望编译产物适用于64位的Ubuntu的目标平台时

C-SDK对其HAL和TLS都已有官方提供的参考实现, 因此可以完整编译出所有的库和例子程序

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.macos.make    3) config.ubuntu.x86
2) config.rhino.make    4) config.win7.mingw32
#? 3

SELECTED CONFIGURATION:

VENDOR :   ubuntu
MODEL  :   x86
...
...

编译

make

获取二进制库

cd output/release/lib
ls

其中有三个主要产物, 它们都是64位架构的:

产物文件名 说明
libiot_hal.a HAL接口层的参考实现, 提供了 HAL_XXX() 接口
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口
libiot_tls.a 裁剪过的 mbedtls, 提供了 mbedtls_xxx() 接口, 支撑 libiot_hal.a

获取可执行程序

cd output/release/bin
ls

其中有两个主要产物, 它们都是64位架构的:

产物文件名 说明
linkkit-example-solo 高级版(旧版API)的例程, 可演示 linkkit_xxx() 接口的使用
mqtt-example 基础版的例程, 可演示 IOT_XXX() 接口的使用

用 make 为32位Linux编译

如果您编译SDK是在一台安装了32位 Linux 的机器上, 那么直接重复上面 用 make 为64位Linux编译 的步骤, 即可得到32位的库和例程

如果您是在安装了64位 Ubuntu16.04 的机器上, 需要编译出32位的库, 请按照下文操作

安装32位工具链

sudo apt-get install -y libc6:i386 libstdc++6:i386 gcc:i386

修改平台配置文件

vim src/board/config.ubuntu.x86

增加如下一行

CONFIG_ENV_CFLAGS   += -m32

比如:

cat src/board/config.ubuntu.x86

CONFIG_ENV_CFLAGS   += \
    -Os -Wall \
    -g3 --coverage \
    -D_PLATFORM_IS_LINUX_ \
    -D__UBUNTU_SDK_DEMO__ \

...
...
CONFIG_ENV_LDFLAGS  += -lpthread -lrt

CONFIG_ENV_LDFLAGS  += -m32
OVERRIDE_STRIP      := strip

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.macos.make    3) config.ubuntu.x86
2) config.rhino.make    4) config.win7.mingw32
#? 3

编译

make

获取二进制库

cd output/release/lib
ls

其中有三个主要产物, 它们都是32位架构的:

产物文件名 说明
libiot_hal.a HAL接口层的参考实现, 提供了 HAL_XXX() 接口
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口
libiot_tls.a 裁剪过的 mbedtls, 提供了 mbedtls_xxx() 接口, 支撑 libiot_hal.a

获取可执行程序

cd output/release/bin
ls

其中有两个主要产物, 它们都是32位架构的:

产物文件名 说明
linkkit-example-solo 高级版(旧版API)的例程, 可演示 linkkit_xxx() 接口的使用
mqtt-example 基础版的例程, 可演示 IOT_XXX() 接口的使用

可以用如下方式验证, 注意 file 命令的输出中, 已经显示程序都是32位的了(ELF 32-bit LSB executable)

file output/release/bin/*

output/release/bin/linkkit-example-countdown: ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/linkkit-example-sched:     ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/linkkit-example-solo:      ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/linkkit_tsl_convert:       ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/mqtt-example:              ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/mqtt-example-multithread:  ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/mqtt-example-rrpc:         ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/ota_mqtt-example:          ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/sdk-testsuites:            ELF 32-bit LSB executable, Intel 80386, ... stripped
output/release/bin/uota_app-example:          ELF 32-bit LSB executable, Intel 80386, ... stripped

用 make 为Windows编译

安装 mingw-w64-i686 工具链

Ubuntu16.04 上, 运行如下命令安装交叉编译工具链

sudo apt-get install -y gcc-mingw-w64-i686

以如下命令和输出确认交叉编译工具链已安装好

i686-w64-mingw32-gcc --version

i686-w64-mingw32-gcc (GCC) 5.3.1 20160211
Copyright (C) 2015 Free Software Foundation, Inc.

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.esp8266.aos   4) config.mk3080.aos    7) config.win7.mingw32
2) config.macos.make    5) config.rhino.make
3) config.mk3060.aos    6) config.ubuntu.x86
#? 7

编译

make -j32 all

需要注意, 对Windows平台, 使用 make 命令编译只能得到二进制库, 使用 make all 命令编译能同时得到库和可执行程序

获取和运行可执行例程

cd output/release/bin
ls

其中有两个主要产物, 它们都是可直接在Windows上运行的:

产物文件名 说明
mqtt-example.exe 基础版的例程, 可演示 IOT_XXX() 接口的使用
linkkit_tsl_convert.exe 高级版的物模型转换工具, 何时需要使用它详见 第二章 快速开始 章节

目前对Windows平台仅提供基础版的例程, 可以把它拿到Windows主机上运行, 如下图则是在一台Win10主机上运行的效果

image | left

基于 make 交叉编译到嵌入式平台

本节的示例适用于开发者的开发环境是 Ubuntu16.04 的Linux主机的情况

这些例子都是在64位主机上的执行情况, 推荐您和阿里开发者一样, 安装64位的操作系统

用 make 为 arm-linux 编译

本节的例子, 在 第三章 移植指南 中也有描述, 是作为一个演示跨平台移植的典型, 会写的更为详细

安装交叉编译工具链

sudo apt-get install -y gcc-arm-linux-gnueabihf

以如下命令和输出确认交叉编译工具链已安装好

arm-linux-gnueabihf-gcc --version

arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

创建平台配置文件

vim src/board/config.arm-linux.demo

CONFIG_ENV_CFLAGS = \
    -D_PLATFORM_IS_LINUX_ \
    -Wall

CONFIG_src/ref-impl/hal         :=
CONFIG_examples                 :=
CONFIG_tests                    :=
CONFIG_src/tools/linkkit_tsl_convert :=

OVERRIDE_CC = arm-linux-gnueabihf-gcc
OVERRIDE_AR = arm-linux-gnueabihf-ar
OVERRIDE_LD = arm-linux-gnueabihf-ld

或者写成

CONFIG_ENV_CFLAGS = \
    -D_PLATFORM_IS_LINUX_ \
    -Wall

CONFIG_src/ref-impl/hal         :=
CONFIG_examples                 :=
CONFIG_tests                    :=
CONFIG_src/tools/linkkit_tsl_convert :=

CROSS_PREFIX := arm-linux-gnueabihf-

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.arm-linux.demo  4) config.mk3060.aos      7) config.ubuntu.x86
2) config.esp8266.aos     5) config.mk3080.aos      8) config.win7.mingw32
3) config.macos.make      6) config.rhino.make
#? 1

编译

make

获取二进制库

cd output/release/lib
ls

其中有两个主要产物, 它们都是arm-linux架构的:

产物文件名 说明
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口
libiot_tls.a 裁剪过的 mbedtls, 提供了 mbedtls_xxx() 接口, 支撑 libiot_hal.a

用 make 为庆科模组 MK3060/MK3080 编译

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.esp8266.aos   4) config.mk3080.aos    7) config.win7.mingw32
2) config.macos.make    5) config.rhino.make
3) config.mk3060.aos    6) config.ubuntu.x86
#? 3

如果是为庆科MK3080编译, 则选择4

编译

make

如果您当前的开发主机上没有安装庆科 MK3060/MK3080 的交叉工具链并导出到 PATH 中, C-SDK会自动下载它们

make

BUILDING WITH EXISTING CONFIGURATION:

VENDOR :   mk3060
MODEL  :   aos

https://gitee.com/alios-things/gcc-arm-none-eabi-linux -> .O/compiler/gcc-arm-none-eabi-linux/main

---
downloading toolchain for arm-none-eabi-gcc .................... [\]

下载完成后, 自动开始交叉编译SDK的源码

https://gitee.com/alios-things/gcc-arm-none-eabi-linux -> .O/compiler/gcc-arm-none-eabi-linux/main

---
downloading toolchain for arm-none-eabi-gcc .................... done

[CC] utils_epoch_time.o                 <=  ...
[CC] json_parser.o                      <=  ...
...
...
[AR] libiot_sdk.a                       <=  ...

获取二进制库

cd output/release/lib
ls

其中有一个主要产物, 它是 MK3060/MK3080 架构的:

产物文件名 说明
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口

用 make 为乐鑫模组 ESP8266 编译

选择平台配置

make reconfig
SELECT A CONFIGURATION:

1) config.esp8266.aos   4) config.mk3080.aos    7) config.win7.mingw32
2) config.macos.make    5) config.rhino.make
3) config.mk3060.aos    6) config.ubuntu.x86
#? 1

编译

make

如果您当前的开发主机上没有安装乐鑫 ESP8266 的交叉工具链并导出到 PATH 中, C-SDK会自动下载它们

make

BUILDING WITH EXISTING CONFIGURATION:

VENDOR :   esp8266
MODEL  :   aos

https://gitee.com/alios-things/gcc-xtensa-lx106-linux -> .O/compiler/gcc-xtensa-lx106-linux/main

---
downloading toolchain for xtensa-lx106-elf-gcc .................... [/]

下载完成后, 自动开始交叉编译SDK的源码

https://gitee.com/alios-things/gcc-arm-none-eabi-linux -> .O/compiler/gcc-arm-none-eabi-linux/main

---
downloading toolchain for xtensa-lx106-elf-gcc .................... done

[CC] utils_epoch_time.o                 <=  ...
[CC] json_parser.o                      <=  ...
...
...
[AR] libiot_sdk.a                       <=  ...

获取二进制库

cd output/release/lib
ls

其中有一个主要产物, 它是 ESP8266 架构的:

产物文件名 说明
libiot_sdk.a SDK的主库, 提供了 IOT_XXX 接口和 linkkit_xxx() 接口

在 Ubuntu 上使用 cmake 的编译示例

本节的示例适用于开发者的开发环境是 Ubuntu16.04 的Linux主机的情况
这些例子都是在64位主机上的执行情况, 推荐您和阿里开发者一样, 安装64位的操作系统

用 cmake 为64位Linux编译

从 CMakeLists.txt 构建makefile

~/srcs/iotx-sdk-c$ mkdir oooo
~/srcs/iotx-sdk-c$ cd oooo

~/srcs/iotx-sdk-c/oooo$ cmake ..

-- The C compiler identification is GNU 5.4.0

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

---------------------------------------------------------------------
Project Name              : iotkit-embedded-V2.2.1
Source Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c
Binary Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c/oooo
System Processor          : x86_64
System Platform           : Linux-4.4.0-87-generic
C Compiler                : /usr/bin/cc
Executable Dir            : /disk2/yusheng.yx/srcs/iotx-sdk-c/oooo/bin
Library Dir               : /disk2/yusheng.yx/srcs/iotx-sdk-c/oooo/lib
SDK Version               : V2.2.1

Building on LINUX ...

---------------------------------------------------------------------

-- Configuring done

-- Generating done

-- Build files have been written to: /disk2/yusheng.yx/srcs/iotx-sdk-c/oooo

编译

make -j32

产物

~/srcs/iotx-sdk-c/oooo$ ls
bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  examples  lib  Makefile  src  tests

可执行程序在 bin/ 目录下, 这些都是64位的可执行程序:

ls bin/

linkkit-example-countdown  linkkit-example-sched  linkkit-example-solo  linkkit_tsl_convert
mqtt-example  mqtt_example_multithread  mqtt_example_rrpc  ota_mqtt-example  uota_app-example

二进制库在 lib/ 目录下:

ls lib/

libiot_hal.a  libiot_sdk.a  libiot_tls.a

用 cmake 为32位Linux编译

修改 CMakeLists.txt 文件

在默认的文件中修改CFLAGS, 加入-m32

SET (CMAKE_C_FLAGS " -Iexamples -Os -Wall")

改成

SET (CMAKE_C_FLAGS " -Iexamples -Os -Wall -m32")

从 CMakeLists.txt 构建makefile

mkdir ooo
cd ooo
cmake ..

编译

make -j32

产物

~/srcs/iotx-sdk-c/ooo$ ls
bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  examples  lib  Makefile  src  tests

可执行程序在 bin/ 目录下:

ls bin/

linkkit-example-countdown  linkkit-example-sched  linkkit-example-solo  linkkit_tsl_convert
mqtt-example  mqtt_example_multithread  mqtt_example_rrpc  ota_mqtt-example  uota_app-example

可以用如下方式验证, 注意 file 命令的输出中, 已经显示程序都是32位的了(ELF 32-bit LSB executable)

file ooo/bin/*

ooo/bin/linkkit-example-countdown: ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/linkkit-example-sched:     ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/linkkit-example-solo:      ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/linkkit_tsl_convert:       ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/mqtt-example:              ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/mqtt-example-multithread:  ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/mqtt-example-rrpc:         ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/ota_mqtt-example:          ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/sdk-testsuites:            ELF 32-bit LSB executable, Intel 80386, ... stripped
ooo/bin/uota_app-example:          ELF 32-bit LSB executable, Intel 80386, ... stripped

二进制库在 lib/ 目录下:

ls lib/

libiot_hal.a  libiot_sdk.a  libiot_tls.a

用 cmake 为arm-linux编译

sudo apt-get install -y gcc-arm-linux-gnueabihf

以如下命令和输出确认交叉编译工具链已安装好

arm-linux-gnueabihf-gcc --version

arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

修改 CMakeLists.txt 文件

在默认的 CMakeList.txt 文件中加入以下一行

SET (CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)

比如

  5 CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
  6 PROJECT (iotkit-embedded-V2.2.1 C)
  7
  8 SET (CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
  9 SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
 10 SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
 11 SET (CMAKE_C_FLAGS " -Iexamples -Os -Wall")

从 CMakeLists.txt 构建makefile

mkdir ooo
cd ooo
cmake ..

可以注意到这一环节中已经按照指定的编译器生成


-- The C compiler identification is GNU 5.4.0

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

---------------------------------------------------------------------
Project Name              : iotkit-embedded-V2.2.1
Source Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c
Binary Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo
System Processor          : x86_64
System Platform           : Linux-4.4.0-87-generic
C Compiler                : arm-linux-gnueabihf-gcc
Executable Dir            : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo/bin
Library Dir               : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo/lib
SDK Version               : V2.2.1

Building on LINUX ...

---------------------------------------------------------------------

-- Configuring done

-- Generating done

-- Build files have been written to: /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo

编译

make -j32

产物

~/srcs/iotx-sdk-c/ooo$ ls
bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  examples  lib  Makefile  src  tests

可执行程序在 bin/ 目录下:

ls bin/

linkkit-example-countdown  linkkit-example-sched  linkkit-example-solo  linkkit_tsl_convert
mqtt-example  mqtt_example_multithread  mqtt_example_rrpc  ota_mqtt-example  uota_app-example

可以用如下方式验证, 注意 file 命令的输出中, 已经显示程序都是32位ARM架构的了(ELF 32-bit LSB executable, ARM, EABI5 version 1)

file ooo/bin/*

ooo/bin/linkkit-example-countdown: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/linkkit-example-sched:     ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/linkkit-example-solo:      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/linkkit_tsl_convert:       ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/mqtt-example:              ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/mqtt_example_multithread:  ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/mqtt_example_rrpc:         ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/ota_mqtt-example:          ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped
ooo/bin/uota_app-example:          ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) ... not stripped

二进制库在 lib/ 目录下, 它们同样是是32位ARM架构的

ls lib/

libiot_hal.a  libiot_sdk.a  libiot_tls.a

用 cmake 为Windows编译

安装 mingw-w64-i686 工具链

Ubuntu16.04 上, 运行如下命令安装交叉编译工具链

sudo apt-get install -y gcc-mingw-w64-i686

以如下命令和输出确认交叉编译工具链已安装好

i686-w64-mingw32-gcc --version

i686-w64-mingw32-gcc (GCC) 5.3.1 20160211
Copyright (C) 2015 Free Software Foundation, Inc.

修改 CMakeLists.txt 文件

在默认的 CMakeList.txt 文件中加入以下一行

SET (CMAKE_C_COMPILER i686-w64-mingw32-gcc)

比如

  5 CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
  6 PROJECT (iotkit-embedded-V2.2.1 C)
  7
  8 SET (CMAKE_C_COMPILER i686-w64-mingw32-gcc)
  9 SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
 10 SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
 11 SET (CMAKE_C_FLAGS " -Iexamples -Os -Wall")

从 CMakeLists.txt 构建makefile

mkdir ooo
cd ooo
cmake ..

可以注意到这一环节中已经按照指定的编译器生成

cmake ..

-- The C compiler identification is GNU 5.4.0

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

---------------------------------------------------------------------
Project Name              : iotkit-embedded-V2.2.1
Source Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c
Binary Dir                : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo
System Processor          : x86_64
System Platform           : Linux-4.4.0-87-generic
C Compiler                : i686-w64-mingw32-gcc
Executable Dir            : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo/bin
Library Dir               : /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo/lib
SDK Version               : V2.2.1

Building on LINUX ...

---------------------------------------------------------------------

-- Configuring done

-- Generating done

-- Build files have been written to: /disk2/yusheng.yx/srcs/iotx-sdk-c/ooo

编译

make -j32

results matching ""

    No results matching ""