Неопределенная ошибка символа для базового класса в общей библиотеке C ++ - PullRequest
4 голосов
/ 11 июля 2009

Я скомпилировал следующий код в качестве разделяемой библиотеки, используя 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 de конструктор. Мог ли я узнать это по загадочному символу в сообщении об ошибке: _ZN3FooD2Ev? D in FooD означает деструктор?

Ответы [ 3 ]

13 голосов
/ 12 июля 2009

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

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

Итак, c ++ фильтр _ZN3FooD2Ev возвращает «Foo :: ~ Foo ()».

8 голосов
/ 11 июля 2009

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

3 голосов
/ 12 июля 2009

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

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

...