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# 常用配置 57无 58 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