简介
c++
组件是为了反对编译 c++
源文件。该组件把全局对象的构造函数放到了指定的段地址中,以撑持 c++
的失常应用与运行。
因为 OneOS-Lite
是很精简的 RTOS
零碎,因而提供的 C++
撑持比较简单。
在 cpp_init.c
源文件中,实现了 C++
零碎的初始化工作:
OS_WEAK int cpp_init(void)
{typedef void(*pfunc)();
extern pfunc __ctors_start__[];
extern pfunc __ctors_end__[];
pfunc *p;
for (p = __ctors_start__; p < __ctors_end__; p++)
(*p)();
return 0;
}
OS_CMPOENT_INIT(cpp_init,OS_INIT_SUBLEVEL_LOW);
其中的 __ctors_start__
和__ctors_end__
在链接脚本中被指定地位:
PROVIDE(__ctors_start__ = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE(__ctors_end__ = .);
可见,在 cpp_init
函数中,全局对象的构造函数就被一一的链接到了链接文件所调配到的段中。而后,OS_CMPOENT_INIT
是 OneOS-Lite
组件初始化的宏,它会把 cpp_init
函数放到组件初始化的地位进行初始化工作。
__ctors_start__
:C++ 全局构造函数段的起始地址__ctors_end__
:C++ 全局构造函数段的完结地址
图形化配置
(Top) → Components→ Cplusplus
[*] cplusplus
简略体验
#include <iostream> // 蕴含头文件 iostream
using namespace std; // 应用命名空间 std
extern "C"
{int test(void);
}
int test( )
{
cout<<"This is a C++ program!";
return 0;
}
编辑一个 c++
文件,并在 main.c
文件中,调用 test
函数,编译运行,既能够应用串口打印该信息。
留神
MicroLIB
不反对 c++
,须要将options
中Use MicroLIB
去掉勾选。
反对 c++
会增大程序的 ram
和flash
。
最初,如果你须要应用到 c++
代码。那么,请在 SConscript
中,把 cpp
文件增加到编译系统中去。
src = Glob('*.c') + Glob('*.cpp')
关注 && 分割
gitee:https://gitee.com/cmcc-oneos/OneOS-Lite
docs:https://oneos-lite.com/
援用自:https://gitee.com/cmcc-oneos/OneOS-Lite/blob/dev/components/cplusplus/README.md