对"vtable for myClass"的未定义引用



可能重复:
对vtable的未定义引用。试图编译一个Qt项目

这是代码

#include <iostream>
#include <QApplication>
#include <QTimer>

class myClass : public QObject {
    Q_OBJECT
public:
    QTimer *timer;
    myClass(){
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(mySlot()));
        timer->start(1000);
    }
public slots:
    void mySlot() {
        std::cout << "Fire" << std::endl;
    }
};
int main() {
    std::cout << "Hello, world";
    myClass atimer;
    return 0;
}

除了这个错误,还有两件事我不明白:

  1. 为什么宏后面没有分号,在本例中是Q_OBJECT。它似乎不遵守C++语法,但人们却写这样的代码。

  2. "public slots"是Qt创建的修饰符,但gcc编译器怎么还能理解它呢?像Qt这样的IDE怎么能修改语言的标准语法呢?

您没有给出确切的错误消息,但我怀疑发生的事情是您没有在代码上运行moc,或者没有编译moc生成的代码,或者没有将代码链接到可执行文件/库中。

至于你的其他问题:

  1. 宏之后不需要使用分号;预处理器不关心分号,只有编译器关心。因此,是否需要手动添加分号取决于您的宏(Q_OBJECT(在本例中扩展到什么,以及在哪里使用它。在您的情况下,不需要分号。

  2. slots是一个扩展为emtpy字符串的宏,因此任何C++编译都可以处理它。然而,slots也被moc识别为一个特殊的关键字。顺便说一句,signals也是如此(它是一个扩展到protected:的宏(。

这只是因为加载Q_OBJECT后没有运行qmake。只需运行qmake(如果使用QtCreator,它必须在Build Menu中(,然后编译;(。

希望它能帮助

通常,对vtable的未定义引用表示您声明了一些虚拟函数,但从未向它们提供定义。也许Q_OBJECT在声明什么?

宏是在考虑C++语法之前展开的,以文本形式工作。这就是为什么宏本身不必遵守C++语法。例如,如果Q_OBJECT在其定义的末尾包含一个分号,以便在替换后获得正确的C++代码,那么这就足够了。

CCD_ 13也可以是宏(甚至可能是空的(。然后,在用虚无替换slots之后,您再次获得有效的C++代码。

您必须使用QT 提供的元对象编译器

通常,如果您获得了对vtable错误的未定义引用,那是因为qmake没有运行并为其生成必要的moc。在项目目录中重新运行qmake应该可以修复它,如果没有,则清除构建并运行quake并再次生成。

最新更新