【问题标题】:C++ - Undefined reference to `vtable (constructor) [duplicate]C ++ - 对`vtable(构造函数)的未定义引用[重复]
【发布时间】:2019-05-15 09:48:14
【问题描述】:

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

编译器生成一个错误:未定义对“vtable for Timer”的引用。其中指带构造函数的字符串: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

【问题讨论】:

    标签: c++ qt connect signals-slots


    【解决方案1】:

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

    【讨论】:

    • 是的,为一个类创建单独的 .h 和 .cpp 文件并不困难。之后,代码开始工作。但我想了解以下内容。我可以在简单的控制台应用程序中的 main() 函数之前直接在 main.cpp 中创建一个类吗?只是将 HEADERS + = main.cpp 行添加到 .pro 文件中不起作用。
    • @Konstantin 有一些技巧。在main.cpp 文件的最后添加#include "main.moc"。然后重新运行 qmake 并重建项目。它对我有用,但我不推荐它:)
    【解决方案2】:

    由于您的Timer 仅具有定义形式(标头中没有声明)Qt moc tool 无法检测Q_OBJECT 宏并生成所需的插槽、信号和元数据信息的实现。

    要修复它,您可以执行以下操作之一:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 2020-07-07
      • 1970-01-01
      • 2016-09-26
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      相关资源
      最近更新 更多