Отладка ошибок компоновщика vtable в GCC - PullRequest
5 голосов
/ 02 февраля 2010

Время от времени при использовании GCC я получаю такие загадочные ошибки:

неопределенная ссылка на 'vtable for classname'

Когда это не вызвано отсутствующей библиотекой, это не очень описательное сообщение об ошибке всегда заставляет меня построчно копаться в файлах кода, чтобы найти недостающую реализацию виртуальной функции. Есть ли способ заставить компоновщик сказать мне , какая виртуальная функция отсутствует, возможно, флаг или что-то? Или это, может быть, говорит мне, но я не понимаю, что он говорит?

1 Ответ

2 голосов
/ 08 февраля 2010

С gcc faq :

При сборке C ++ компоновщик говорит: конструкторы, деструкторы или виртуальные таблицы не определены, но я определил их

Стандарт ISO C ++ определяет, что все виртуальные методы класса, не чисто виртуальные должны быть определены, но не требует какой-либо диагностики за нарушение этого правила [Class.virtual] / 8. Основываясь на этом Предположение, GCC будет только излучать неявно определенные конструкторы, оператор присваивания, деструктор и виртуальная таблица класса в блок перевода, который определяет его первый такой не встроенный метод.

Поэтому, если вы не можете определить это конкретный метод, компоновщик может пожаловаться на отсутствие определений для явно не связанных символов. К сожалению, для улучшения это сообщение об ошибке, это может быть необходимо изменить компоновщик, и это не всегда может быть сделано.

Решение состоит в том, чтобы все виртуальные методы, которые не являются чистыми определены. Обратите внимание, что деструктор должен быть определенным, даже если он объявлен чисто виртуальный [class.dtor] /7.

Решением, которое я принимаю, является поиск по имени класса, поиск объявления виртуальных методов и проверка, есть ли какое-либо определение. Я не нашел другого решения для этого.

...