未明确引用'vtable for MyCalss'

时间:2015-02-19 18:26:47

标签: c++ qt qt-creator

我使用 Empty Qt Project

创建了QTCreator的新项目

MocTest.pro

QT += core
QT -= gui

TARGET = MocTest
CONFIG   += console

TEMPLATE = app


SOURCES += \
    main.cpp

的main.cpp

#include <QCoreApplication>
#include <iostream>

class A : public QObject
{
    Q_OBJECT

public:
    A() {}

public slots:
    void slotA() {std::cout<<"Hi!";}
};

class B : public QObject
{
    Q_OBJECT

public:
    B () {}

    void doB() {emit ss();}

signals:
    void ss();
};

int main(int argc, char *argv[])
{
    QCoreApplication app (argc, argv);
    A a;
    B b;
    return app.exec();
}

我收到了错误

D:\ Test \ MocTest \ debug \ main.o:-1:在函数`ZN1AC1Ev'中:

D:\ Test \ MocTest \ main.cpp:9:错误:未定义引用'vtable for A'

D:\ Test \ MocTest \ main.cpp:20:错误:未定义引用'vtable for B'

D:\ Test \ MocTest \ main.cpp:4:错误:未定义引用'vtable for A'

D:\ Test \ MocTest \ main.cpp:15:错误:未定义引用'vtable for B'

collect2.exe:-1:错误:错误:ld返回1退出状态

2 个答案:

答案 0 :(得分:2)

Qmake确保运行Moc:

  • HEADERS变量中列出的文件。 Qmake安排编译并链接生成的C ++实现文件,方法是将其添加到SOURCES。
  • SOURCES或OBJECTIVE_SOURCES变量中列出的文件由moc处理。 Qmake没有链接任何潜在的输出,因此产生的moc输出必须是#included。

看起来你需要把它放在:

#include "main.moc"

某处main.cpp(可能在最后)。 详情请见https://qt-project.org/forums/viewthread/21420

答案 1 :(得分:0)

vtable引用由moc为类heriting QObject生成。 这些是使用HEADERS变量的文件生成的。 然后你必须分开标题和实现。这将给出:

myclass.h

class A : public QObject
{
    Q_OBJECT

public:
    A();
public slots:
    void slotA();
};

class B : public QObject
{
    Q_OBJECT

public:
    B();
    void doB();
signals:
    void ss();
};

和myclass.cpp

#include "myclass.h"

A::A()
{}
void A::slotA()
{ std::coud << "Hi!; }

B::B()
{}
void B::doB
{ emit ss(); }

然后是TestMoc.pro

QT = core # default is QT = core gui, so -= gui is enough or just =core
HEADERS = myclass.h
SOURCES = myclass.cpp main.cpp

请记住,在内联方法中调用信号通常是个坏主意。 此外,如果你在main中调用doB,在app.exec()之前,它可能无法处理,因为一旦运行事件循环就会管理信号/插槽