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

StackOverflow https://stackoverflow.com/questions/1114115

Вопрос

Я скомпилировал следующий код как общую библиотеку, используя 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 конструктор.Что я делаю не так и как это можно исправить?

Обновить:Спасибо, джбар!Итак , это был Foo deконструктор.Мог ли я узнать это из загадочного символа в сообщении об ошибке: _ZN3FooD2Ev?Делает ли D в FooD расшифровывается как деструктор?

Это было полезно?

Решение

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

Другие советы

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

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

Таким образом, c ++ filt _ZN3FooD2Ev возвращает "Foo::~Foo()".

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

Ознакомьтесь с программой "demangle".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top