在用avr-gcc编译时,我遇到了链接器错误,如下所示:
undefined reference to `__cxa_pure_virtual'
我找到了本文件,上面写着:
__cxa_pure_virtual
函数是在调用纯虚拟函数时调用的错误处理程序。 如果要编写具有纯虚拟函数的C++应用程序,则必须提供自己的__cxa_pure_virtual
错误处理函数。例如:extern "C" void __cxa_pure_virtual() { while (1); }
按照建议定义此函数可以修复错误,但我想知道:
发布于 2009-05-28 12:02:23
如果在程序运行时的任何地方创建了一个对象,并且没有填充一个虚拟函数指针,那么当调用相应的函数时,您将调用一个“纯虚拟函数”。
您所描述的处理程序应该在开发环境附带的默认库中定义。如果您碰巧省略了默认库,您将发现这个处理程序未定义:链接器看到一个声明,但没有看到定义。那时你需要提供你自己的版本。
无限循环是可以接受的,因为它是一个“响亮的”错误:您的软件的用户会立即注意到它。任何其他“大声”的实现也是可以接受的。
发布于 2012-02-20 02:38:25
1)函数__cxa_pure_virtual()的目的是什么?
在对象构造/销毁过程中,可以调用纯虚拟函数。如果发生这种情况,将调用__cxa_pure_virtual()来报告错误。请参阅“纯虚拟函数调用”崩溃从何而来?
2)你为什么要自己定义它呢?
通常这个函数是由libstdc++提供的(例如在Linux上),但是avr和Arduino工具链不提供libstdc++。
Arduino IDE在构建某些程序时设法避免了链接器错误,因为它使用了选项“-ffunction fdata-sections”和"-Wl -gc-sections“链接,后者删除了对未使用符号的引用。
3)为什么将__cxa_pure_virtual()编码为无限循环是可以接受的?
好吧,这至少是安全的;它做了一些可以预测的事情。中止程序并报告错误会更有用。但是,一个无限循环将很难调试,除非您有一个调试器可以中断执行并给出堆栈回溯。
https://stackoverflow.com/questions/920500
复制相似问题