C++ QObject:缺少vtable链接错误
我知道这个问题已经被问了很多次了,但我在这里和谷歌都找不到答案 这是我的头文件C++ QObject:缺少vtable链接错误,c++,qt,qtcore,qt-signals,moc,C++,Qt,Qtcore,Qt Signals,Moc,我知道这个问题已经被问了很多次了,但我在这里和谷歌都找不到答案 这是我的头文件 #ifndef MAINCONTROLLER_H #define MAINCONTROLLER_H #include <QSettings> #include <QDebug> #include <QDir> #include <QObject> #include "PhTools/PhString.h" #include "PhStrip/PhStripDoc.h
#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
它可能来自
信号
,但我不确定…您需要在源文件末尾包含这一行:
#包括“MainController.moc”
或者,您也可以使用buildsystem处理此问题,但这可能是前者更容易。当在编译代码后添加
Q\u对象
宏时,必须再次运行qmake
。这将把MainController.moc
的创建和编译添加到您的Makefile
中,从而防止链接器错误。可能的重复(还有其他几个重复)@matstpeterson:Nice。你联系的“解决方案”不能为我解决任何问题。不过还是要谢谢你,现在我被困住了。此外,我需要QObject使用信号。在对这个答案的评论中,它说编辑.pro
文件有助于解决问题(并运行qmake):不幸的是,我的.pro
fil已经使用Qt+=gui
,运行qmake不会改变谢谢!这解决了我添加Q\u对象
宏后的问题。右键单击项目,然后单击运行qmake,然后再次尝试构建。
#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)