Название: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Сентябрь 30, 2010, 10:48 Если при компиляции появляется ошибка такого рода
undefined reference to vtable for (имя_класса) то, 1. Вероятно, вы объявили, но забыли реализовать один или несколько виртуальных методов класса, не наследованного от QObject. 2. от пользователя ufna): Цитировать хз, на моей практике такая ошибка возникает когда Q_OBJECT забыл добавить, затем вставляешь, но qmake заново не делаешь )) Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: zenden от Сентябрь 30, 2010, 11:07 а может просто запустить qmake?? (очень часто указанная ошибка возникает из за отсутствия файла moc)
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Сентябрь 30, 2010, 11:14 а может просто запустить qmake?? (очень часто указанная ошибка возникает из за отсутствия файла moc) в моем случае не помогло. да и не могло помочь: объявил - реализуй!просто само сообщение не говорит конкретно в чем ошибка. Поэтому и отписался - чтобы народ не тратил по полчаса-часу, как я ) Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: navrocky от Сентябрь 30, 2010, 11:31 То же самое с любым виртуальным методом, который не реализован. Плюс если объявляешь Q_OBJECT но не прогоняешь по нему moc такая же ошибка, частенько встречается когда используется cmake в качестве системы сборки. Или в случае с qmake когда Q_OBJECT объявлен в cpp.
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Сентябрь 30, 2010, 11:59 Блин, ребята.
Ну читайте внимательно, что ли... Если не реализовал вирт.метод SomeMethod, то компилятор ругается предметно: Код: undefined reference to 'SomeMethod' А здесь ругань на vtable для класса, а никак не на Код: undefined reference to '~SomeDestructor' Мой пост для того, чтобы помочь разобраться в этом, только и делов. Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: pastor от Сентябрь 30, 2010, 12:35 Блин, ребята. Ну читайте внимательно, что ли... Если не реализовал вирт.метод SomeMethod, то компилятор ругается предметно: Неверно. Как раз будт ошибка линковки: Цитировать Undefined reference to 'vtable for ...' Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: pastor от Сентябрь 30, 2010, 12:54 Для интереса собери код:
Код
и получишь Цитировать Undefined reference to 'vtable for MyClass' Деструктор здесь не причем. Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Сентябрь 30, 2010, 13:12 Уважаемый pastor.
Только что провел еще один тест. Если класс наследован от QObject, то компилятор в обоих случаях ругается правильно: В семпле поставляемом с QtCreator 2.0 - browser.pro Закомментировал mousePressEvent(QMouseEvent*) Ругается: Код: undefined reference to `WebView::mousePressEvent(QMouseEvent*)' Объявил, но не стал реализовывать ~WebView. Ругнулся правильно Код: undefined reference to `WebView::~WebView В моем случае наследование не от QObject: при нереализованном виртуальном методе Код: undefined reference [b]to `Vcon::PluginItem::type() const' При нереализованном виртуальном деструкторе: Код: ./debug\pluginmanager.o: In function `PluginItem': Для чистоты эксперимента в вышеназванном проекте browser сделал виртуальным деструктор ~BookmarkNode(); До виртуализации при отсутствии реализации компилятор правильно ругался на Код: C:\Qt\2010.04\qt\demos\browser-build-desktop/../browser/bookmarks.cpp:299: undefined reference [b]to `BookmarkNode::~BookmarkNode()'[/b] а с виртуализацией Код: C:\Qt\2010.04\qt\demos\browser-build-desktop/../browser/xbel.cpp:49: undefined reference [b]to `vtable for BookmarkNode' [/b] Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Сентябрь 30, 2010, 13:19 Ну да. При сборке IClass все как Вы сказали.
Надо резюмировать как-то ) Например, ошибка с vtable может возникнуть в случае отсутствия реализации части виртуальных методов. Как-то так? Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: ufna от Сентябрь 30, 2010, 13:30 хз, на моей практике такая ошибка возникает когда Q_OBJECT забыл добавить, затем вставляешь, но qmake заново не делаешь ))
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: pastor от Сентябрь 30, 2010, 13:48 Теперь берем тотже пример и делаем вызов foo():
Код
Смотрм, что получилось :) Думаю сейчас все станет ясно Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: kdm от Октябрь 02, 2010, 18:38 Очень дельный совет, у меня такое часто когда-то случалось. В такие моменты я вообще был в растерянности и пересоздавал набор файлов класса *.cpp, *.h.
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: frostyland от Октябрь 03, 2010, 10:32 Теперь берем тотже пример и делаем вызов foo(): Да, я примерил пример, и поправил первое сообщение. Вполне возможно, кому-то будет полезно.... Думаю сейчас все станет ясно Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: blood_shadow от Январь 09, 2011, 00:35 То же самое с любым виртуальным методом, который не реализован. Плюс если объявляешь Q_OBJECT но не прогоняешь по нему moc такая же ошибка, частенько встречается когда используется cmake в качестве системы сборки. Или в случае с qmake когда Q_OBJECT объявлен в cpp. у меня с qmake такое получилось(программа состоит с одного файла .срр) закоментил Q_OBJECT в файле cpp и все стало норм. Кто знает из-за чего это? Баг линкера? и еще как тогда реализовать сигналы и слоты если приходиться выбрасывать макрос Q_OBJECT() ? вот код к примеру: Код: #include <iostream> Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: alexman от Январь 09, 2011, 00:42 ; попробуй убрать!
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: Fat-Zer от Январь 09, 2011, 00:51 Разнеси в разные файлы... походу moc не переваривает файл с функцией main...
*поправлю себя... если единственное объявление класса встречается в файле с функцией main Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: blood_shadow от Январь 09, 2011, 00:53 ; попробуй убрать! не не помагает, да ; - соответствует пустой инструкции их можно хоть 2 втулить ниче небудетНазвание: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: brankovic от Январь 09, 2011, 01:43 С кьют недавно начал возиться, но для себя выработал правило: если в классе есть Q_OBJECT, то его объявление должно жить в хедере. Я так понял это фича qt и moc такая. Про слоты: без Q_OBJECT нельзя сделать.
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: pastor от Январь 09, 2011, 04:19 Цитировать походу moc не переваривает файл с функцией main... o_O Цитировать С кьют недавно начал возиться, но для себя выработал правило: если в классе есть Q_OBJECT, то его объявление должно жить в хедере. Я так понял это фича qt и moc такая. Ничего подобного. Никто не мешает объявлять классы в main.cpp или прочих cpp файлах. Достаточно заинклудить в конец такого файла <имя_файла>.moc. Например main.moc для случая с main.cpp Читаем в ассистанте Using the Meta-Object Compiler (moc) Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: Fat-Zer от Январь 09, 2011, 04:32 И правда сработало=) вот так и познаётся истинный дзен)
Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: blood_shadow от Январь 09, 2011, 19:53 Ничего подобного. Никто не мешает объявлять классы в main.cpp или прочих cpp файлах. Достаточно заинклудить в конец такого файла <имя_файла>.moc. Например main.moc для случая с main.cpp спасибо, работаетпопробовал вручную исправить меик-файл в секции компиляции как указано в ассистанте Код: release\main.o: release\main.moc без добавления #include "main.moc" ошибка вилетает прежняя.. В чем магия это инклуда? вроде и меик-файл поправил, а всеравно.. Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: lit-uriy от Январь 09, 2011, 20:02 >>release\main.o: release\main.moc
а что main.o от main.cpp не зависит? Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: blood_shadow от Январь 09, 2011, 20:18 >>release\main.o: release\main.moc да вроде как-бы main.moc: зависит от ..\C++2\main.cpp, а потом уже главная цель release\main.o: release\main.mocа что main.o от main.cpp не зависит? Передрал данный код с асистанта радел Using the Meta-Object Compiler (moc) глава Writing Make Rules for Invoking moc я так предполагаю что запись говорит - обработать мок*ом main.cpp и сделать с него main.moc(добавить метаинформацию), а потом этот main.moc скомпилировать в main.o Название: Re: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ] Отправлено: lit-uriy от Январь 09, 2011, 20:57 создаётся mao-файл, инклюдится в main.cpp и то что получилось компилируется.
|