С++: каковы причины ссылки undefined на "typeinfo для [имя класса]", кроме виртуальных функций
некоторые из этих ошибок решаются путем изменения
virtual void draw();
к
virtual void draw() {};
НО, каковы могут быть другие причины этих ошибок?, кроме виртуальных функций.
Что может быть причиной следующей ошибки.
/tmp/cciGEgp5.o:(.rodata._ZTI14CustomXmppPump[typeinfo for CustomXmppPump]+0x18):
undefined reference to `typeinfo for XmppPump'
Ответы
Ответ 1
Если вы компилируете RTTI (-frtti), убедитесь, что ваши зависимые библиотеки также скомпилированы вместе с ним, а не -fno-rtti. В противном случае вы получите ошибку typeinfo при подклассе класса, скомпилированного с -fno-rtti или используя dynamic_cast.
Ответ 2
В GCC первый неединичный виртуальный метод используется для определения единицы перевода, в которой создаются объекты vtable и typeinfo. Если вы затем не определяете этот метод, он создает ошибку, которую вы видите, поскольку он ожидал, что вы определите этот метод где-нибудь, и ожидал, что это определение испустит вывод vtable и typeinfo для класса.
http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html
Когда вы меняете объявление virtual void draw();
на встроенное определение virtual void draw() {};
, он выбирает другую функцию для испускания vtable.