Я пишу программу на С++ для встроенного устройства, и я хочу скомпилировать ее без libstdС++, исключений и динамического выделения памяти.
Пример программы:
#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 = С++ 11
/tmp/ccd0Wydq.o: В функции
A::~A()': src.cpp:(.text._ZN1AD2Ev[_ZN1AD5Ev]+0x29): undefined reference to
оператор delete (void *) '/tmp/ccd0Wydq.o: В функцииA::~A()': src.cpp:(.text._ZN1AD0Ev[_ZN1AD5Ev]+0x20): undefined reference to
оператор delete (void *)'/tmp/ccd0Wydq.o: В функцииB::~B()': src.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x35): undefined reference to
operator delete (void *) '/tmp/ccd0Wydq.o: В функцииB::~B()': src.cpp:(.text._ZN1BD0Ev[_ZN1BD5Ev]+0x20): undefined reference to
оператор delete (void *)' /tmp/ccd 0Wydq.o:(.rodata._ZTV1A[_ZTV1A]+0x20): undefined ссылка на `__cxa_pure_virtual 'collect2: ошибка: ld возвращен 1 статус выхода Makefile: 2: рецепт для цели "все" не выполнен: *** [все] Ошибка 1
Я понимаю, зачем нужен __cxa_pure_virtual
, но не мог для меня жизнь понять, зачем мне нужна реализация delete
.
Я выполняю операции new
или delete
в коде, зачем это нужно?
При реализации обеих функций для удовлетворения требований к компоновщикам кажется, что они не называются (как и ожидалось).
Есть ли способ избежать реализации этих функций?