未定义的引用vtable,Linux中的Qt

时间:2010-12-24 11:20:22

标签: c++ qt opengl ubuntu qglwidget

我试图在Ubuntu 10.04中的Code :: Blocks下编译Qt和OpenGL程序。我得到'未定义的引用'vtable for GLWidget'

#ifndef _GLWIDGET_H
#define _GLWIDGET_H

#include <QtOpenGL/QGLWidget>
#include "stdlib.h"

class GLWidget : public QGLWidget {

    Q_OBJECT // must include this if you use Qt signals/slots

public:
    GLWidget(QWidget *parent = 0);
    ~GLWidget();
protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
    void keyPressEvent(QKeyEvent *event);
};

#endif  /* _GLWIDGET_H */

我借用了这个人的代码,看看它是否有效,因为我的工作原因是因为同样的原因。 Code

这是GLWidget.cpp:

#include <QtGui/QMouseEvent>
#include "glwidget.h"

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {
    setMouseTracking(true);
}

GLWidget::~GLWidget()
{
}

void GLWidget::initializeGL() {
   ...
}

void GLWidget::resizeGL(int w, int h) {
   ...
}

void GLWidget::paintGL() {
    ...
}

void GLWidget::keyPressEvent(QKeyEvent* event) {
    ...
    }
}

我从GL部分删除了代码以缩短代码。如果你需要它,我总是可以发布它。

#include <QtGui/QApplication>
#include <QtOpenGL/QGLWidget>
#include "glwidget.h"

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

    QApplication app(argc, argv);

    GLWidget window;
    window.resize(800,600);
    window.show();

    return app.exec();
}

5 个答案:

答案 0 :(得分:5)

在project.pro文件中添加

QT += opengl

所以它知道它必须链接到GL库。

答案 1 :(得分:3)

清理项目并在其上运行qmake。

答案 2 :(得分:1)

'未定义对'vtable for GLWidget'的引用很可能意味着GLWidget的第一个非内联虚函数的定义未在可执行文件中链接。

在目前的情况下,我的猜测是它应该由moc生成的文件提供(但由于我没有为QT编程,我可能会在这里弄错。)

答案 3 :(得分:1)

有时会在将Q_OBJECT添加到头文件时发生这种情况,并且可能意味着缺少moc_文件。

我从个人经验中发现,做到以下几点已经解决了这个问题:

  1. $ qmake filename .pro
  2. $ make

答案 4 :(得分:1)

Q_OBJECT添加到项目中的某个头文件后,我遇到了这个问题。

我只是从 QT Creator中收到此错误消息,而不是从Linux命令行构建项目时。

对我来说,解决方案是删除与项目目录位于同一级别的YourProjectName-build-desktop文件夹。然后,当我从QT Creator中构建项目时,它神奇地工作了。