vtable for .. ссылка из ошибки компиляции xcode - PullRequest
17 голосов
/ 22 сентября 2009

Я получаю следующую ошибку при компиляции проекта iPhone. Кто-нибудь знает, как я могу это исправить? "vtable для oned :: MultiFormatUPCEANReader", на который ссылаются из: __ZTVN4oned23MultiFormatUPCEANReaderE $ non_lazy_ptr в MultiFormatUPCEANReader.o ld: символ (ы) не найден collect2: ld вернул 1 статус выхода

Ответы [ 5 ]

40 голосов
/ 22 сентября 2009

Кажется, проблема в том, что в классе MultiFormatUPCEANReader я объявил конструктор и деструктор, но не написал тела для деструктора, это вызывало эту досадную проблему. Надеюсь, это поможет кому-нибудь решить их ошибку компиляции. Это ужасная ошибка компилятора с небольшим количеством информации!

12 голосов
/ 25 сентября 2009

Обычно это проблема с отсутствующей vtable: C ++ FAQ Lite 23.10 .

Из интернет-архива:

Если вы получили ошибку ссылки в форме «Ошибка: обнаружены неразрешенные или неопределенные символы: виртуальная таблица для класса Fred», возможно, в классе Fred имеется неопределенная функция виртуального члена.

Компилятор обычно создает волшебную структуру данных, называемую «виртуальной таблицей» для классов, которые имеют виртуальные функции (именно так он обрабатывает динамическое связывание). Обычно вам не нужно знать об этом вообще. Но если вы забудете определить виртуальную функцию для класса Fred, иногда вы получите эту ошибку компоновщика.

Вот мельчайшая деталь: многие компиляторы помещают эту волшебную «виртуальную таблицу» в модуль компиляции, который определяет первую не встроенную виртуальную функцию в классе. Таким образом, если первой не встроенной виртуальной функцией в Fred является wilma (), компилятор поместит виртуальную таблицу Фреда в тот же модуль компиляции, где он видит Fred :: wilma (). К сожалению, если вы случайно забыли определить Fred :: wilma (), а не получить Fred :: wilma () не определено, вы можете получить «Виртуальная таблица Фреда не определена». Грустно, но верно.

6 голосов
/ 28 января 2013

В моем случае это был определенный чисто виртуальный метод в базовом классе, который был объявлен, но не реализован в производном классе (а точнее, первом виртуальном методе в vtable), например ::10000

class Base
{
public:
  virtual int foo() = 0;
  virtual int bar() = 0;
};

class Derived : public Base
{
public:
  Derived() {}
  ~Derived() {}

  virtual int foo(); // <-- causes this obscure linker error
  virtual int bar() {return 0;}
};
4 голосов
/ 01 февраля 2010

Та же самая ошибка может произойти, если забыть поставить имя класса перед определением метода в файле cpp - как я только что сделал. И это не вещь xcode, я использую cmake для сборки и gcc как компилятор (как обычно делает xcode).

3 голосов
/ 01 марта 2012

Для меня это был XCode, так как у меня тот же проект, который прекрасно компилируется.

В моем файле Foo.h у меня был конструктор и деструктор, который реализован в файле .cpp. Но у меня также был другой класс, который был у меня в Foo.h, реализация которого была в Foo.h, а не в .cpp. Поэтому мне пришлось добавить файл Foo.h в проект XCode -> Targets -> "TragetName" -> BuildSources, и эта проблема была решена.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...