Неопределенная ошибка символа для базового класса в общей библиотеке C++

Я скомпилировал следующий код как общую библиотеку, используя g++ -shared ...:

class Foo {
public:
  Foo() {}
  virtual ~Foo() = 0;
  virtual int Bar() = 0;
};

class TestFoo : public Foo {
public:
  int Bar() { return 0; }
};

extern "C" {
  Foo* foo;
  void init() {
    // Runtime error: undefined symbol: _ZN3FooD2Ev
    foo = new TestFoo(); // causes error
  }
  void cleanup() { delete(foo); }
  void bar() { foo->Bar(); }
}

Суть в том, чтобы раскрыть функциональность моих классов (здесь в качестве примера приведены лишь минимальные классы игрушек) в виде простого C API с тремя функциями init, cleanup, а также bar,

Когда я пытаюсь загрузить общую библиотеку (используя dyn.load в R) Я получаю ошибку:

unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev

Таким образом, кажется, он не может найти Foo конструктор. Что я делаю не так и как это можно исправить?

ОБНОВЛЕНИЕ: Спасибо, JBAR! Так было Foo де структор. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev? Ли D в FooD стоять за деструктор?

3 ответа

Решение

Мы не можем объявить чистый виртуальный деструктор. Даже если виртуальный деструктор объявлен как чистый, ему придется реализовать пустое тело (по крайней мере) для деструктора.

ОБНОВЛЕНИЕ: Так что это был деструктор Foo. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev? D в FooD обозначает деструктор?

Вы можете использовать программу с ++ фильт.

Таким образом, C++ фильтр _ZN3FooD2Ev возвращает "Foo::~Foo()".

Что касается вашего обновления, "_ZN3FooD2Ev" является "Foo::~Foo()" искажено.

Проверьте программу "demangle".

Другие вопросы по тегам