对vtable的未定义引用(最小例子)

时间:2016-10-25 20:04:42

标签: c++ qt

这可能是下一个副本,但是我在这段代码中找不到错误:

#include <qwt_plot.h>

class QLinePlot : public QwtPlot
{
    Q_OBJECT
public:
    QLinePlot(QWidget* parent = 0, Qt::WindowFlags flags = 0): QwtPlot(parent)
    {
    }

    ~QLinePlot()
    {
    }

};


int main( int argc, char **argv )
{
    QLinePlot * plot = new QLinePlot();
}

我删除了build文件夹并再次运行了qmake,但没有更改。错误消息是

test.cpp:7: undefined reference to `vtable for QLinePlot'

2 个答案:

答案 0 :(得分:3)

您错过了文件末尾的#include "test.moc"

// test.cpp
#include <qwt_plot.h>

class QLinePlot : public QwtPlot
{
    Q_OBJECT
public:
    using QwtPlot::QwtPlot;
};


int main( int argc, char **argv )
{
    QLinePlot plot;
}

#include "test.moc"

添加include行后,必须在项目上重新运行qmake。

但你的例子并不是最小的。您需要重现的问题是:

#include <QObject>
class Foo : public QObject {
  Q_OBJECT
  ~Foo() {}
}
int main() { Foo foo; }

答案 1 :(得分:0)

您应该在头文件QLinePlot中拥有test.h课程。这更干净,您无需在test.moc中加入test.cpp。例如

TEST.CPP

#include "test.h"
int main( int argc, char **argv )
{
  QLinePlot plot;
}

test.h

#include <qwt_plot.h>
class QLinePlot : public QwtPlot
{
   Q_OBJECT

   // stuff
};