Russian Qt Forum
Ноябрь 24, 2024, 05:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Если вылезает ошибка "undefined reference to vtable for ..." [СОВЕТ]  (Прочитано 64447 раз)
frostyland
Гость
« : Сентябрь 30, 2010, 10:48 »

Если при компиляции появляется ошибка такого рода
undefined reference to vtable for (имя_класса)
то,
1. Вероятно, вы объявили, но забыли реализовать один или несколько виртуальных методов класса, не наследованного от QObject.
2. от пользователя ufna):
Цитировать
хз, на моей практике такая ошибка возникает когда Q_OBJECT забыл добавить, затем вставляешь, но qmake заново не делаешь ))

« Последнее редактирование: Сентябрь 30, 2010, 13:35 от frostyland » Записан
zenden
Гость
« Ответ #1 : Сентябрь 30, 2010, 11:07 »

а может просто запустить qmake?? (очень часто указанная ошибка возникает из за отсутствия файла moc)
Записан
frostyland
Гость
« Ответ #2 : Сентябрь 30, 2010, 11:14 »

а может просто запустить qmake?? (очень часто указанная ошибка возникает из за отсутствия файла moc)
в моем случае не помогло. да и не могло помочь: объявил - реализуй!
просто само сообщение не говорит конкретно в чем ошибка. Поэтому и отписался - чтобы народ не тратил по полчаса-часу, как я )

Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Сентябрь 30, 2010, 11:31 »

То же самое с любым виртуальным методом, который не реализован. Плюс если объявляешь Q_OBJECT но не прогоняешь по нему moc такая же ошибка, частенько встречается когда используется cmake в качестве системы сборки. Или в случае с qmake когда Q_OBJECT объявлен в cpp.
Записан

Гугль в помощь
frostyland
Гость
« Ответ #4 : Сентябрь 30, 2010, 11:59 »

Блин, ребята.
Ну читайте внимательно, что ли...
Если не реализовал вирт.метод SomeMethod, то компилятор ругается предметно:
Код:
undefined reference to 'SomeMethod'
, и становится ежу понятно, где грабли.

А здесь ругань на vtable для класса, а никак не на
Код:
undefined reference to '~SomeDestructor'

Мой пост для того, чтобы помочь разобраться в этом, только и делов.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Сентябрь 30, 2010, 12:35 »

Блин, ребята.
Ну читайте внимательно, что ли...
Если не реализовал вирт.метод SomeMethod, то компилятор ругается предметно:

Неверно. Как раз будт ошибка линковки:

Цитировать
Undefined reference to 'vtable for ...'
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Сентябрь 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'

Деструктор здесь не причем.
« Последнее редактирование: Сентябрь 30, 2010, 12:56 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
frostyland
Гость
« Ответ #7 : Сентябрь 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]

Записан
frostyland
Гость
« Ответ #8 : Сентябрь 30, 2010, 13:19 »

Ну да. При сборке IClass все как Вы сказали.
Надо резюмировать как-то )
Например, ошибка с vtable может возникнуть в случае отсутствия реализации части виртуальных методов. Как-то так?
Записан
ufna
Гость
« Ответ #9 : Сентябрь 30, 2010, 13:30 »

хз, на моей практике такая ошибка возникает когда Q_OBJECT забыл добавить, затем вставляешь, но qmake заново не делаешь ))
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Сентябрь 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();

Смотрм, что получилось Улыбающийся

Думаю сейчас все станет ясно
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kdm
Гость
« Ответ #11 : Октябрь 02, 2010, 18:38 »

Очень дельный совет, у меня такое часто когда-то случалось. В такие моменты я вообще был в растерянности и пересоздавал набор файлов класса *.cpp, *.h.
« Последнее редактирование: Октябрь 02, 2010, 18:41 от kdm » Записан
frostyland
Гость
« Ответ #12 : Октябрь 03, 2010, 10:32 »

Теперь берем тотже пример и делаем вызов foo():
...
Думаю сейчас все станет ясно
Да, я примерил пример, и поправил первое сообщение. Вполне возможно, кому-то будет полезно.
Записан
blood_shadow
Гость
« Ответ #13 : Январь 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();

}
Записан
alexman
Гость
« Ответ #14 : Январь 09, 2011, 00:42 »

; попробуй убрать!
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 22.
настройка контекстной рекламы яндекс директ