我正在使用arm-none-eabi-g++版本4.9.3为ARM Cortex M4编译一个嵌入式应用程序。为了使目标图像尽可能小,我将应用程序与-specs=nano.specs链接起来。
现在我遇到了一个奇怪的问题:当我在代码中的任何地方定义一个纯虚函数(然后我在子类中定义它的主体)时,我会得到这个链接错误:
abort.c:-1: Error: undefined reference to `_exit'
sbrkr.c:-1: Error: undefined reference to `_sbrk'
signalr.c:-1: Error: undefined reference to `_kill'
...这是正确的,因为我真的没有在我的项目中定义这些函数,因为我根本不使用它们。但是,当我想创建一个纯虚函数时,为什么编译器需要这些函数呢?当我为虚函数定义一个空体时,链接器错误就消失了。有人能给我解释一下纯虚拟函数背后的魔力吗?
编辑:为了让事情更清楚,下面是我的代码的一个非常简单的示例:
class Parent {
public:
virtual int foo() { return -1; } // This compiles normally.
virtual int foo() = 0; // This gives me the linker error above.
}
class Child {
public:
virtual int foo { return 42; }
}
Child test;发布于 2017-08-22 22:28:30
纯虚方法需要异常支持,因为有时可以调用它们。缺少的库函数是实现异常处理所必需的。请参阅相关问题here。
https://stackoverflow.com/questions/45819499
复制相似问题