QObject: Missing vtable link error

I know that the question has been asked many times, but I canโ€™t find a solution here and on Google.

Here is my header file

#ifndef MAINCONTROLLER_H #define MAINCONTROLLER_H #include <QSettings> #include <QDebug> #include <QDir> #include <QObject> #include "PhTools/PhString.h" #include "PhStrip/PhStripDoc.h" class MainController : public QObject { Q_OBJECT public: explicit MainController(QObject *parent = 0); void loadSettings(); PhString getLastFile(); void setLastFile(PhString fileName); bool openDoc(PhString fileName); signals: void docChanged(); private: QSettings * _settings; PhStripDoc * _doc; }; #endif // MAINCONTROLLER_H 

And my CPP file:

 #include "MainController.h" MainController::MainController(QObject *parent) : QObject(parent) { _doc = new PhStripDoc(); loadSettings(); } void MainController::loadSettings() { _settings = new QSettings(QDir::homePath() + "/Library/Preferences/com.me.me.plist", QSettings::NativeFormat); getLastFile(); } PhString MainController::getLastFile() { qDebug() << "lastfile :" << _settings->value("last_file", "").toString(); return _settings->value("last_file").toString(); } bool MainController::openDoc(PhString fileName) { bool succeed = _doc->openDX(fileName); if (succeed) emit docChanged(); return succeed; } void MainController::setLastFile(PhString filename) { _settings->setValue("last_file", filename); } 

And here is the error log:

 Undefined symbols for architecture x86_64: "MainController::docChanged()", referenced from: MainController::openDoc(QString) in MainController.o "vtable for MainController", referenced from: MainController::MainController(QObject*) in MainController.o MainController::MainController(QObject*) in MainController.o NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

It may be from signals , but I'm not sure ...

+6
source share
2 answers

You need to include this line at the end of the source file:

#include "MainController.moc"

Alternatively, you can also handle this with your own prefab system, but this is probably the first one easier.

+1
source

When the Q_OBJECT macro Q_OBJECT added after the code has already been compiled, qmake should be run again. This will add the creation and compilation of MainController.moc to your Makefile , which will prevent a linker error.

+11
source

Source: https://habr.com/ru/post/948559/


All Articles