【发布时间】:2016-12-29 07:31:44
【问题描述】:
我正在为嵌入式设备编写一个 C++ 程序,我想在没有 libstdc++、异常和动态内存分配的情况下编译它。
示例程序:
#include <stdio.h>
class A
{
public:
virtual ~A() {}
virtual void Foo() = 0;
};
class B : public A
{
public:
virtual ~B() {}
virtual void Foo() override{}
};
int main()
{
B b;
return 0;
}
我立即遇到了以下错误。
$ gcc src.cpp -static -fno-rtti -fno-exceptions -std=c++11
/tmp/ccd0Wydq.o: 在函数中
A::~A()': src.cpp:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x29): undefined reference tooperator delete(void*)' /tmp/ccd0Wydq.o: 在函数中A::~A()': src.cpp:(.text._ZN1AD0Ev[_ZN1AD5Ev]+0x20): undefined reference tooperator delete(void*)' /tmp/ccd0Wydq.o: 在函数中B::~B()': src.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x35): undefined reference tooperator delete(void*)' /tmp/ccd0Wydq.o: 在函数B::~B()': src.cpp:(.text._ZN1BD0Ev[_ZN1BD5Ev]+0x20): undefined reference tooperator delete(void*)' /tmp/ccd0Wydq.o:(.rodata._ZTV1A[_ZTV1A]+0x20): 未定义的引用 `__cxa_pure_virtual' collect2:错误:ld 返回 1 退出状态 Makefile:2: 目标“all”的配方失败 make: *** [all] 错误 1
我明白为什么需要__cxa_pure_virtual,但我一生都无法理解为什么需要delete 实现。
我没有在代码中执行new 或delete 操作,为什么需要它?
当实现这两个函数以满足链接器的需求时,似乎都没有调用(如预期的那样)。
有没有办法避免实现这些功能?
【问题讨论】:
-
让它们什么都不做来实现它们有什么问题吗?
-
我会用一个大的
assert(1==0)对它们进行存根,以确保它们不会被调用。 -
这是一个丑陋的解决方案。如果这是唯一的解决方案,我会这样做,但我想知道为什么会这样。
-
尝试添加
-flto或-fwhole-program和-Wl,--as-needed。
标签: c++ linker delete-operator