【问题标题】:QObject: Missing vtable link errorQObject:缺少 vtable 链接错误
【发布时间】:2013-06-30 00:32:59
【问题描述】:

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

这是我的头文件

#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,但我不确定...

【问题讨论】:

标签: c++ qt qtcore qt-signals moc


【解决方案1】:

您需要在源文件末尾包含这一行:

#include "MainController.moc"

或者,您也可以使用您的构建系统来处理这个问题,但这可能是前者更容易。

【讨论】:

    【解决方案2】:

    在代码编译完成后添加Q_OBJECT 宏时,必须再次运行qmake。这会将MainController.moc 的创建和编译添加到您的Makefile 中,从而防止链接器错误。

    【讨论】:

    • 谢谢!这解决了我添加 Q_OBJECT 宏后的问题。右键单击您的项目并单击 Run qmake 然后再次尝试构建。
    猜你喜欢
    • 2015-01-18
    • 2012-08-11
    • 2013-02-22
    • 2014-10-12
    • 1970-01-01
    • 2016-06-04
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多