Неопределенная ссылка на `vtable
Я создаю приложение с графическим интерфейсом, используя Qt; Я пытаюсь сделать hello world
используя Qt, и он работает отлично, но когда я создаю собственный виджет списка, я получаю undefined reference to vtable
ошибка при компиляции:
Я использую eclipse и C++
#ifndef QMENUFILTER_H_
#define QMENUFILTER_H_
#include <qmenu.h>
class CustomMenuFilter : QMenu
{
Q_OBJECT
public:
CustomMenuFilter () ;
~CustomMenuFilter() ;
private:
QMenu FilterMenu;
QAction *AddFilterAct ;
QAction *DeleteFilterAct ;
Q_SLOT
void contextMenuEvent(QContextMenuEvent *event);
};
#endif /* QMENUFILTER_H_ */
#include "QMenuFilter.h"
CustomMenuFilter::CustomMenuFilter():QMenu()
{
DeleteFilterAct = new QAction("DeleteFilter" , this);
AddFilterAct = new QAction("AddFilter" , this);
AddFilterAct->setText("AddFilter");
DeleteFilterAct->setText("DeleteFilter");
}
Файл журнала: http://pastebin.com/raw.php?i=qZes6bkm
4 ответа
Вам также нужно определить dtor, который создаст vtable
CustomMenuFilter::~CustomMenuFilter() { ... }
Хотя существуют некоторые (зависящие от компилятора) правила, которые описывают, когда именно компилятор генерирует виртуальную таблицу, вам, как правило, это не важно знать. Важно то, что вам нужно определить dtor, и компилятор позаботится о vtable, поэтому, если вы видите ошибку "неопределенная ссылка на vtable", всегда проверяйте dtor.
Несколько компиляторов выдают vtable в TU, который определяет первое внешнее определение виртуального - неявно, в данном случае это ваш деструктор (потому что деструктор QMenu, скорее всего, виртуальный).
Поэтому добавление определения вашего деструктора должно исправить это.
// CustomMenuFilter.cpp
CustomMenuFilter::~CustomMenuFilter() {}
Из фактоидов #qt при получении vtable-ошибки в производный от QObject класс:
- Убедитесь, что
Q_OBJECT
макрос присутствует в определении всех производных от QObject классов. - Убедитесь, что вы объявляете классы, производные от QObject, ТОЛЬКО в заголовочных файлах.
- Убедитесь, что все ваши заголовочные файлы перечислены в вашем.pro-файле в
HEADERS
список. - Запускайте qmake каждый раз, когда добавляете
Q_OBJECT
к одному из ваших классов или измените ваш.pro файл.
Я не вижу вывода moc, связанного в конечном исполняемом файле в вашем журнале сборки:
g ++ -L / usr / local / lib / -lQtGui -lQtCore -o "CameraManagerAfterBeta"./trunk/Source/Camera.o./trunk/Source/Interface.o./trunk/Source/Manager.o./trunk/ Source / QMenuFilter.o./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc
Нет moc_QMenuFilter.o связан с. Это ошибка. Вполне вероятно, что вы добавили Q_OBJECT
макрос и забыл перезапустить qmake (или даже не добавил заголовок в HEADERS
список в.pro файле).
Установите CMAKE_AUTOMOC в ON, это решило мою проблему.
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)