未定义对vtable的引用,Qt在Linux中。

5

我在Ubuntu 10.04的Code::Blocks下尝试编译一个Qt和OpenGL程序。但是出现了“undefined reference to '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 */

我借鉴了这位大佬的代码来测试,因为我的代码也由于同样的原因而无法正常工作。 代码

以下是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个回答

5
在您的project.pro文件中添加:
QT += opengl

因此,它知道它必须链接到GL库。


谢谢。现在如果我使用QTCreator编译,它可以直接编辑.pro文件,所以它可以工作了。但是Code::Blocks会自动创建.pro文件。有什么办法可以操纵它吗? - Mores Fre
1
可能在 C::B 内部有导入 pro 文件的选项,但无论如何我建议使用 Qt Creator 进行 Qt 开发。 - ismail
谢谢,我一定会使用Qt Creator。 - Mores Fre

3
清理项目并运行qmake。

在收到模糊的错误信息一个小时后,你不会知道这个回答有多么苦涩。但还是谢谢。 - ICoffeeConsumer
说实话,有时候你会不得不做两次...这甚至是更糟糕的经历,因为你会认为代码出了什么问题,但实际上根本没有任何问题... - osirisgothra

1

'undefined reference to 'vtable for GLWidget' 的意思很可能是 GLWidget 的第一个非内联虚函数的定义没有链接到可执行文件中。

在这种情况下,我猜测应该由 moc 生成的文件提供(但由于我不为 QT 编程,所以我可能在这里弄错了)。


1

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

我只在QT Creator中得到这个错误信息,而不是在Linux命令行中构建项目时。

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


谢谢,这个解决方案对我也有用。我尝试在Qt Creator中使用“Clean All”,但没有任何作用。我不得不手动删除文件夹。 - Mr. Shickadance

1
有时在头文件中添加Q_OBJECT可能会出现这种情况,这意味着缺少moc_文件。
从个人经验中,我发现执行以下操作可以解决此问题:
  1. $ qmake filename.pro
  2. $ make

右键单击您的项目根目录。点击“运行qmake”。这对我有用。奇怪这个错误仍然存在?是否有错误报告? - Albin Stigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接