Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QObject:缺少vtable链接错误_C++_Qt_Qtcore_Qt Signals_Moc - Fatal编程技术网

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)