ARM C++ newlibnano:纯虚函数导致链接器错误
ARM C++ newlibnano: Pure virtual function causes linker error
我正在使用 arm-none-eabi-g++ 版本 4.9.3 为 ARM Cortex M4 编译嵌入式应用程序。为了使目标图像尽可能小,我link应用-specs=nano.specs
。
现在我遇到了一个奇怪的问题:当我在代码的任何地方定义一个纯虚函数时(然后我在子 class 中定义它的主体),我得到这个 linking 错误:
abort.c:-1: Error: undefined reference to `_exit'
sbrkr.c:-1: Error: undefined reference to `_sbrk'
signalr.c:-1: Error: undefined reference to `_kill'
...
这是正确的,因为我确实没有在我的项目中定义这些功能,因为我根本不使用它们。但是为什么当我想制作一个纯虚函数时编译器需要这些函数呢?当我为虚函数定义一个空主体时,linker 错误就消失了。谁能给我解释一下纯虚函数背后的魔力?
编辑:为了让事情更清楚,这是我的代码的一个非常简单的例子:
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;
纯虚方法需要异常支持,因为有时可以调用它们。需要缺少的库函数来实现异常处理。
请参阅相关问题 here。
我正在使用 arm-none-eabi-g++ 版本 4.9.3 为 ARM Cortex M4 编译嵌入式应用程序。为了使目标图像尽可能小,我link应用-specs=nano.specs
。
现在我遇到了一个奇怪的问题:当我在代码的任何地方定义一个纯虚函数时(然后我在子 class 中定义它的主体),我得到这个 linking 错误:
abort.c:-1: Error: undefined reference to `_exit'
sbrkr.c:-1: Error: undefined reference to `_sbrk'
signalr.c:-1: Error: undefined reference to `_kill'
...
这是正确的,因为我确实没有在我的项目中定义这些功能,因为我根本不使用它们。但是为什么当我想制作一个纯虚函数时编译器需要这些函数呢?当我为虚函数定义一个空主体时,linker 错误就消失了。谁能给我解释一下纯虚函数背后的魔力?
编辑:为了让事情更清楚,这是我的代码的一个非常简单的例子:
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;
纯虚方法需要异常支持,因为有时可以调用它们。需要缺少的库函数来实现异常处理。 请参阅相关问题 here。