我正在为一款嵌入式系统(特别是PSoC 5,使用PSoC Creator)开发代码,并使用C++编写。
虽然我已经克服了使用C ++的大部分障碍,首先是使用编译器标志-x c ++
进行编译,定义new和delete运算符,并确保使用编译器标志-fno-exception
不会抛出异常。然而,当涉及到使用虚函数时,我遇到了困境。
如果我尝试声明一个虚函数,编译器会给出错误信息undefined reference to "vtable for __cxxabiv1::__class_type_info"
。唯一的解决方法是使用编译器标志-fno-rtti
,这可以避免错误并使其成功编译。然而,如果我这样做,运行重载虚函数时嵌入式程序会崩溃,我认为这是因为vtable不存在。
我不明白为什么不能在嵌入式平台上使用虚函数,因为它只是成员对象之前或之后的内存中的额外空间(具体取决于编译器)。
我尝试使用虚函数的原因是因为我想在C++中使用FreeRTOS,其他人通过使用虚函数来实现了这一点(请参见http://www.freertos.org/FreeRTOS_Support_Forum_Archive/July_2010/freertos_Is_it_possible_create_freertos_task_in_c_3778071.html进行讨论,以及https://github.com/yuriykulikov/Event-driven_Framework_for_Embedded_Systems提供了一个编写良好的嵌入式C++ FreeRTOS框架)。