Russian Qt Forum

Qt => Общие вопросы => Тема начата: frostyland от Сентябрь 30, 2010, 10:48



Название: Если вылезает ошибка "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
Для интереса собери код:

Код
C++ (Qt)
class IClass
{
public:
   virtual void foo() = 0;
};
 
class MyClass : public IClass
{
public:
   void foo();
};
 
MyClass x;

и получишь

Цитировать
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' 
[/b]collect2: ld returned 1 exit status

При нереализованном виртуальном деструкторе:
Код:
./debug\pluginmanager.o: In function `PluginItem': 
V:\work\Qt\vcon\src\vcon-build-desktop/../vcon/pluginmanager.cpp:358: undefined reference [b]to `vtable for Vcon::PluginItem' [/b]
V:\work\Qt\vcon\src\vcon-build-desktop/../vcon/pluginmanager.cpp:358: undefined reference [b]to `vtable for Vcon::PluginItem' [/b]
collect2: ld returned 1 exit status

Для чистоты эксперимента в вышеназванном проекте 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():

Код
C++ (Qt)
class IClass
{
public:
   virtual void foo() = 0;
};
 
class MyClass : public IClass
{
public:
   void foo();
};
 
MyClass x;
x.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>
#include <QMainWindow>
#include <QtGui/QApplication>
#include <QObject>

using std::cout;
using std::endl;


class Test : public QMainWindow
{
    //Q_OBJECT;

public:
    Test(QWidget *parent = 0) : QMainWindow(parent) {}
    void Click() { setWindowFilePath("file.txt"); }
    ~Test() {}

};


int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    Test test;
    test.show();

    return app.exec();

}


Название: 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

release\main.moc: ..\C++2\main.cpp
moc $(DEFINES) $(INCPATH) -i $< -o $@

без добавления #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.o от main.cpp не зависит?
да вроде как-бы main.moc: зависит от ..\C++2\main.cpp, а потом уже главная цель release\main.o: release\main.moc

Передрал данный код с асистанта радел 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 и то что получилось компилируется.