QObject: отсутствует ссылка на vtable

Я знаю, что вопрос задавался много раз, но я не могу найти решение здесь, ни в Google.

Вот мой заголовочный файл

#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

И мой файл CPP:

#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);
}

И вот журнал ошибок:

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)

Это может прийти из signals но я не уверен…

6

Решение

Вам нужно включить эту строку в конец вашего исходного файла:

#include "MainController.moc"

В качестве альтернативы, вы также можете справиться с этим с помощью вашей системы сборки, но, вероятно, первое проще.

1

Другие решения

Когда Q_OBJECT макрос добавляется после того, как код уже скомпилирован, qmake должен быть запущен снова. Это добавит создание и компиляцию MainController.moc на ваш Makefile таким образом предотвращая ошибку компоновщика.

12

По вопросам рекламы [email protected]