Неопределенная ссылка на `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 класс:

  1. Убедитесь, что Q_OBJECT макрос присутствует в определении всех производных от QObject классов.
  2. Убедитесь, что вы объявляете классы, производные от QObject, ТОЛЬКО в заголовочных файлах.
  3. Убедитесь, что все ваши заголовочные файлы перечислены в вашем.pro-файле в HEADERS список.
  4. Запускайте 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)
Другие вопросы по тегам