开发者学堂课程【HaaS 物联网应用开发课程:3_1_2 AliOS Things 编译工具及编译配置系统】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/801/detail/13824
3_1_2 AliOS Things 编译工具及编译配置系统
内容介绍
一、工具简介
二、编译配置系统说明
一、 工具简介
1.gcc-编译选项
以 Linux 系统应用程序开发为例查看编译过程,书写以下程序:
root@8b09079bcc1a:/ workspace/gcc_ test# cat helloworld. C
#include <stdio. h>
#include <stdarg. h>
#include <string. h>
int main(void) {
printf(" welcome to helloworld\n' );
return 0;
}
代码内容较为简单,只有打印 Welcome to Hello World。在 Linux 上编译 Hello World.C,使用指令如下:
gcc -0 helloworld helloworld.c
意思就是用 GCC 来编译 Hello World 点 C,并且输出应用程序的名字:Hello World。在编译完成之后,结果如下:
Hello World
执行 Hello World 应用程序就可以看到打印出 Welcome to Hello World 语句。执行 GCC 语句中执行过程如下:
在执行上述语句时,GCC 会进行4个步骤,第一步是预编译,第二步是编译,第三步是汇编,第四步是链接,链接完成之后,才会生成 Hello Worl 应用程序。可以使用以下代码进行对应步骤,结果查看:
GCC-C Hello World.C
GCC-S Hello World.C
GCC-E Hello World.C>Hello World.I
Hello World 编写成功之后,Hello World 应用程序基本信息如下:
查看应用程序基本信息可以使用如下代码:
readelf -h helloworld
应用程序基本信息包括 data 及可以在什么机器下运行和头部的大小。以下是最常用的 GCC 编译选项:
-E
预处理,开发过程中想快速确定某个宏可以使用“-E -dM”
通过以上代码可以快速查看使用了哪些宏定义。
-C
把预处理、编译、汇编都做了,但是不链接
-S
把.c 文件汇编为.s 文件
-D
定义宏
-D 是指在定义的过程中手动使用宏定义传到编译系统中。
-O
指定输出文件
-I
指定头文件目录
-L
指定链接时库文件目录
-l
指定链接哪一个库文件
可以使用 GCC-Help 查看 GCC 更多编译选项。
2.AliOS Things 交叉编译工具简介
基于 AliOS 进行物联网应用的开发和 PC 开发,不同点在于物联网开发的应用程序运行在嵌入式硬件上,而不是PC上编译出来的,程序不通用,可以使用的编译工具也不同。
要想编出嵌入式应用上使用的应用程序,需要使用交叉编译工具链进行编译。AliOS 在编译过程当中,会自动下载交叉工具编译链,并把交叉工具链存放在 Build compiler 目录下。
使用 AOS make 的时候会尝试查看使用的工具是否存在,如果不存在,会从 gitee 上下载,下载完成之后再开始编译。已经使用过 AOS make,就不会有以上过程。虽然编译嵌入式硬件上运行的应用程序和编译 PC 上的应用程序使用的 tool Change 不同,但是编译过程相同。在 AliOS things 交叉编译工具上编译出来的应用程序,基本信息如下:
基本信息包括小端格式、机器和头部结构,但是在 machine 方面不同,此时的基本信息是 arm,是指可以在arm体系结构 CPU 上运行,Header 是52位 bytes。
二、编译配置系统说明
阿里 OS things 3.1采用的是 menu config 的图形配置系统,配置系统工制作的基础是名为 config.in 的组件配置文件。组件配置文件分为两部分,第一部分是顶层配置文件,顶层配置文件是应用程序配置文件的总入口,包含组件配置文件及系统配置变量。在用户配置工程时会自动生成。并且放置在工程应用的根目录下。 Application Example目录下的所有应用程序目录中都有 config in,也就是顶层配置文件。顶层配置文件包含了当前工程所依赖组件的配置文件及系统配置变量。当用户修改了应用代码,再引入新的组件或删除之前所应用的组件之后。在编译过程中,编译系统会自动更新底层配置文件,增加或删除相关的配置文件。以下是 application/Example/Link IT demo 的案例:
AOS APP LinkIT demo 是 APP 配置选项,没有系统配置选项,没有必需组件配置文件,如果定义了 AOS app LinkIT demo,以下所有的配置才会生效。在 Link cat 中有 OTA 功能,如果选中 Enabled AOS OTA 之后,会自动选择AOS component OTA 对应的组件,最后是应用的版本号信息。
除了顶层配置文件之外,还有组件配置文件。组件配置文件是用于对组件配置的文件。 Component 下所有的独立组件,根目录中的 config .in 都是组件配置文件,Comp 目录下的基本组件也是组件配置文件。一般情况下每个配置文件中都包含两项,第一项是唯一的组件配置选项,即组件 ID。第二项是组件能力对应的配置选项。组件配置文件和顶层配置文件的差异在于以下2点:
(1)组件配置文件默认为需要设置为使能状态,且不允许改为禁止;
(2)不使用 select 使能其它组件,需要在组件 Makefile (aos.mk)中选择所依赖的组件
3.组件依赖关系
AliOS things 是一切皆组件的思想,大概率 A 组件会依赖于 B 组件提供的功能。由此需要设置 A 组件依赖于 B 组件。依赖关系配置如下:
(1)在组件配置文件(Config.in)配置
在 Config.in 中使用 select 去选择其它组件,在3.1版本中,只有顶层配置文件可以选用这种方式,组件配置文件不可以选用该方式。
(2)在 Makefile (aos.mk)配置
在 aos.mk 中使用$(NAME)_COMPONENTS += 来选择其它组件,顶层配置文件和组件配置文件中均可使用此方法。
Netmgr 实现如图:
Config AOS comp net mgr,是组件 ID。默认需要为 Yes,不能设置为 No。不能在 config.in 中选用组件的依赖,要使用 Name components 选择组件依赖关系。组件能力配置项可设置为 Yes 或 No。右下方是是否支持网络优化功能的设置。
Menu config 是网络类型选择,如果使用蜂窝网,则需要选择 AOS net with CELLULAR;如果是 WiFi 网络,需要选择 AOS net with WiFi;如果使用以太网,需要选择 AOS net with ETH。