QObject:缺少vtable链接错误

8

我知道这个问题已经被问了很多次,但是我在这里和谷歌上都找不到解决方案。

这是我的头文件

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

它可能来自于 信号,但我不确定...


可能是重复的问题:从QObject派生带有虚函数的类会导致链接错误 - Mats Petersson
(有几个其他的重复项) - Mats Petersson
在这个答案的评论中,它说编辑.pro文件有助于解决问题(并运行qmake): https://dev59.com/kG445IYBdhLWcg3wnrki - Mats Petersson
很遗憾,我的.pro文件已经包含了Qt += gui,运行qmake也不会改变它。 - Thomas Ayoub
正如上一条评论所说,我已经解决了它,但不是用你的方法,这就是为什么我不能接受你的... - Thomas Ayoub
显示剩余5条评论
2个回答

14

如果在编译代码后添加Q_OBJECT宏,则必须再次运行qmake。这将向您的Makefile中添加MainController.moc的创建和编译,从而避免链接器错误。


3
谢谢!在我添加了 Q_OBJECT 宏之后,问题得到了解决。右键单击您的项目并点击“运行 qmake”,然后再次尝试构建即可。 - mattbell87

2

在源文件的末尾,您需要包含以下行:

#include "MainController.moc"

或者,您也可以通过构建系统处理此问题,但前者可能更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接