1@page cplusplus cplusplus
2
3[更正文档](https://gitee.com/alios-things/cplusplus/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html)
4
5# 概述
6## AliOS Things C++组件支持C++11、C++库及STL,支持主要特性如下:
7- 基本类特性,包括继承、模板、多态等;
8- exception catch;
9- tuple
10- 时钟延时等操作
11- 线程创建操作等
12- singleton单例模式
13- 智能指针
14- 右值引用
15- RTTI运行时类型识别
16- lambda匿名函数
17- cond条件变量
18
19## AliOS Things C++组件对内核接口进行了封装,提供了一组自定义的类(原生类)。使用自定义类的优势是资源消耗少。这些原生类在自定义的命名空间AOS中。自定义类包括:
20- thread线程类
21- Timer软件定时器类
22- Semaphore信号量类
23- Mutex互斥信号量类
24- Queue队列类
25- WorkQueue工作队列类
26
27## 版权信息
28> Apache license v2.0
29
30## 目录结构
31```tree
32├── mutex.cpp           # AOS: Mutex类
33├── queue.cpp           # AOS: Queue类
34├── semaphore.cpp       # AOS: Semaphore类
35├── thread.cpp          # AOS: thread类
36├── timer.cpp           # AOS: Timer类
37├── workQueue.cpp       # AOS: WorkQueue类
38├── cpp_mem.cpp         # C++ new/delete适配
39├── cpp_init.c          # C++ C++初始化,将执行静态对象构造
40├── example             # C++ 功能示例
41├── package.yaml        # 编译配置文件
42├── include             # 对外统一引用**aos_cpp.h**即可
43│   ├── cpp_mem.h
44│   ├── cpp_mutex.h
45│   ├── cpp_queue.h
46│   ├── cpp_semaphore.h
47│   ├── cpp_thread.h
48│   ├── cpp_timer.h
49│   └── cpp_workQueue.h
50└── aos_cpp.h           # 对外统一头文件
51```
52
53## 依赖组件
54* rhino
55
56# 常用配置
5758
59# API说明
60## C++ 11标准使用参考相关C++标准
61## AliOS Things自定义类使用说明如下
62- 使用AliOS Things自定义类需要先声明AOS命令空间
63> using namespace AOS;
64- 各自定义类相关说明参见如下链接:
65
66- 参考 [cpp_aos_workqueue](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__workqueue.html)
67- 参考 [cpp_aos_timer](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__timer.html)
68- 参考 [cpp_aos_thread](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__thread.html)
69- 参考 [cpp_aos_sem](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__sem.html)
70- 参考 [cpp_aos_queue](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__queue.html)
71- 参考 [cpp_aos_mutex](https://g.alicdn.com/alios-things-3.3/doc/group__cpp__aos__mutex.html)
72
73
74# 使用示例
75组件使用示例相关的代码下载、编译和固件烧录均依赖AliOS Things配套的开发工具,所以首先需要参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),下载安装。
76待开发环境搭建完成后,可以按照以下步骤进行示例的测试。
77
78如果需要使用cplusplus的功能,需要注意下面内容:
79- 需要首先调用cpp_init初始化cpp基础功能,添加对cplusplus组件的依赖后aos_component_init中自动会调用
80- 需要关注相应的c++ 编译选项
81
82标准C++使用示例参考**[example/cpp_standard](https://gitee.com/alios-things/cplusplus/tree/master/example/cpp_standard)**,AliOS自定义类使用参考**example/cpp_aos**。
83
84## 步骤1 创建或打开工程
85
86**打开已有工程**
87
88如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。
89
90**创建新的工程**
91
92组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html)93
94## 步骤2 添加cplusplus组件
95> helloworld_demo组件的package.yaml中添加
96```yaml
97depends:
98  - cplusplus: master # helloworld_demo中引入cplusplus组件
99```
100
101## 步骤3 下载组件
102
103在已安装了  的开发环境工具栏中,选择Terminal -> New Terminal启动终端,并且默认工作路径为当前工程的workspace,此时在终端命令行中输入:
104
105```shell
106
107aos install cplusplus
108
109```
110
111上述命令执行成功后,组件源码则被下载到了./components/cplusplus路径中。
112
113## 步骤4 添加示例代码
114> cplusplus组件的package.yaml中[example示例代码](https://gitee.com/alios-things/cplusplus/tree/master/example)115```sh
116source_file:
117  - example/cpp_aos/*.c
118  - example/cpp_aos/*.cpp
119  - example/cpp_standard/*.c
120  - example/cpp_standard/*.cpp
121```
122其中由于example/cpp_aos/basic_test.cpp要测试**catch**异常功能,需要编译选项加入**-fexceptions**。在实际使用中不使用该选项有利于降低空间大小。
123```yaml
124build_config:
125  cxxflag: '-fexceptions'
126```
127
128## 步骤5 编译固件
129
130在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)131
132## 步骤6 烧录固件
133
134helloworld_demo案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。
135
136## 步骤7 打开串口
137
138固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考[《AliOS Things集成开发环境使用说明之查看日志》](https://help.aliyun.com/document_detail/302382.html)139
140当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。
141
142## 步骤8 测试示例
143**运行标准C++示例**
144> CLI命令行输入:
145
146```sh
147cpp_stand
148```
149
150> CLI关键日志:
151```sh
152timed mutex test ok
153thead test ok
154conditon varialbe test ok
155static singleton test ok
156shared ptr test ok
157lamda test ok
158tuple test ok
159rvalue test ok
160atomic test ok
161```
162说明:上面是主要模块运行成功的日志打印,屏蔽了一些中间输出,以及hellworld_demo自身的循环输出,实际运行如果没有出现**test error**字样即代表功能运行正常。
163
164**运行aos封装类**
165> CLI命令行输入:
166
167```sh
168cpp_aos
169```
170
171> CLI关键日志:
172```sh
173hello world C!
174hello world C++!
175Total area: 35
176Total paint cost: $2450
177******(有省略)
178demo_task1 count  9
179demo_task1 lock
180demo_task2 count  9
181demo_task1 unlock
182demo_task2 lock
183demo_task2 unlock
184demo_task2 count  4
185```
186
187# 注意事项
188> rtti_test.cpp测试依赖打开rtti功能(dynamic_cast或typeid),因此不能使用**-fno-rtti**编译选项。
189> basic_test.cpp测试catch异常功能,因此依赖选项**-fexceptions**。
190
191在正常使用时,按照自身需求,可以增加编译选项**-fno-rtti**,或去除编译选项**-fexceptions**来达到降低版本大小的目的。
192
193# FAQ
194Q1: 在编译时出现错误提示要加选项:error: exception handling disabled, use -fexceptions to enable
195     或者编译带try-catch的代码时提示变量未定义:error: 'msg' was not declared in this scope
196> 答:这是因为默认关闭了-fexceptions选项引起的,可在package.yaml中搜索语句#cxxflag: '-fexceptions', 把前面的#号去掉,使能该选项。注:使能该选项后将导致镜像变大。
197
198