Qt: неопределенная ссылка на `vtable для

Когда я пытаюсь скомпилировать свою программу, я получаю сообщение об ошибке

obj/backgroundWorker.o: In function `BackgroundWorker':
.../backgroundWorker.cpp:6: undefined reference to `vtable for BackgroundWorker'
obj/backgroundWorker.o: In function `~BackgroundWorker':
.../backgroundWorker.cpp:14: undefined reference to `vtable for BackgroundWorker'

Я уже нашел множество причин этой ошибки, но пока не смог решить проблему в своем коде:

backgroundWorker.hpp

#include <QObject>
#include <QPushButton>

class BackgroundWorker : public QWidget{

    Q_OBJECT

    public:
        explicit BackgroundWorker();
        ~BackgroundWorker();

        private slots:
            void start();

    private:
        QPushButton* mStartButton;
};

backgroundWorker.cpp

#include <iostream>
#include "getInput.hpp"
#include "backgroundWorker.hpp"
#include "LIF_network.hpp"

BackgroundWorker::BackgroundWorker(){
    mStartButton = new QPushButton("Start",this);
    mStartButton->setGeometry(QRect(QPoint(100,100),QSize(200,50)));

    connect(mStartButton, SIGNAL(released()), this, SLOT(start()));
}

BackgroundWorker::~BackgroundWorker(){
    delete mStartButton;
}

void BackgroundWorker::start(){
    //stuff not related to qt
}

main.cpp

#include <QApplication>
#include "backgroundWorker.hpp"

int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    BackgroundWorker bw;
    return a.exec();
}

** .pro файл **

CONFIG += qt debug c++11
QT += widgets

QMAKE_CC = clang++
QMAKE_CXX = clang++
QMAKE_CXXFLAGS += -Wall -Werror -O3
Headers += image.hpp \
            getInput.hpp \
            LIF_network.hpp \
            backgroundWorker.hpp \

SOURCES += main.cpp \
            image.cpp \
            getInput.cpp \
            LIF_network.cpp \
            backgroundWorker.cpp \


OBJECTS_DIR = ./obj

person Natjo    schedule 07.01.2016    source источник
comment
Он должен быть в верхнем регистре: HEADERS   -  person Frank Osterfeld    schedule 08.01.2016
comment
Это решило мою проблему. Но он уже работал, он просто перестал работать, когда я добавил некоторые функции библиотеки Qt. Вот почему я даже не подумал об этом   -  person Natjo    schedule 08.01.2016
comment
Удалять mSmartButton в деструкторе не нужно. Поскольку вы передали это как родительский объект в конструкторе, он будет удален за вас.   -  person Brad    schedule 08.01.2016


Ответы (1)


Как Фрэнк Остерфельд упомянул в комментарии, правильное имя для переменной - это верхний регистр HEADERS. И он должен содержать список всех заголовков, в которых есть макрос Q_OBJECT

Это необходимо, потому что qmake необходимо знать список файлов заголовков для передачи в moc.

person Teivaz    schedule 05.08.2019