C ++-对`vtable(构造函数)的未定义引用

时间:2019-05-15 09:48:15

标签: c++ qt connect signals-slots

我在控制台应用程序中创建了用于处理QTimer的最简单的类。

编译器生成错误:未定义对“ vtable for Timer”的引用。 Whereind使用构造函数引用字符串:Timer(){}

我在此站点上找到了许多有关此问题的建议,例如:

Undefined reference to vtable. Trying to compile a Qt project

Qt Linker Error: "undefined reference to vtable"

Q_OBJECT throwing 'undefined reference to vtable' error

所有答案归结为清除项目,然后运行QMake并重建项目。 不幸的是,所有这些都没有帮助我。 我还尝试删除“ Debug”文件夹,并在执行上述操作后-结果相同。

我在真正的多文件程序中不断地积极使用信号和插槽技术,但从未遇到过此类问题。

请分享您的想法!

#include <QCoreApplication>
#include <QDebug>
#include <QTimer>
#include <QObject>

class Timer : public QObject {
    Q_OBJECT

public:
    Timer() {}
    virtual ~Timer() {}

public slots:
    void someSlot();
};

void Timer::someSlot() {
    qDebug() << "someSlot()";
}

int main(int argc, char *argv[])
{
    QCoreApplication aa(argc, argv);

    QTimer *timer = new QTimer();
    Timer *myTimer = new Timer();

    QObject::connect(timer, SIGNAL(timeout()), myTimer, SLOT(someSlot()));
    timer->start(1500);

    return aa.exec();
}

//-----------------------
// pro-file

QT += core
QT -= gui

CONFIG += c++11 c++14

TARGET = test_for_all
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

2 个答案:

答案 0 :(得分:2)

由于您的Timer仅具有定义形式(标头中没有声明),Qt moc tool无法检测到Q_OBJECT宏并无法生成所需的时隙,信号和元数据信息。< / p>

要解决此问题,您可以执行以下一项操作:

  • 使用Timer声明创建标头
  • 假设您的源代码也是标头,因此该文件将被提供给模拟工具。因此,只需添加专业文件:
HEADERS += main.cpp

答案 1 :(得分:2)

由于它是从*.pro继承的,因此您必须为您的类创建头文件并将其正确添加到QObject文件中。