链接器错误:未定义对“QGLViewer 的 vtable”的引用

Posted

技术标签:

【中文标题】链接器错误:未定义对“QGLViewer 的 vtable”的引用【英文标题】:linker error: undefined reference to `vtable of QGLViewer’ 【发布时间】:2012-04-20 09:27:37 【问题描述】:

我正在做一个可视化项目。它应该在 QGLViewer 上查看 3d 模型。我有一个像这样定义的 QGLViewer 子类:

class GLViewer : public QGLViewer

    Q_OBJECT
public:
    explicit GLViewer(QWidget *parent = 0,const QGLWidget* shareWidget=0, Qt::WFlags flags=0);
protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
signals:
public slots:
;

像这样实现c'tor:

GLViewer::GLViewer(QWidget *parent, const QGLWidget* shareWidget, Qt::WFlags flags):
    QGLViewer(parent,shareWidget,flags)


我收到链接器错误:

glviewer.o: In function `GLViewer::GLViewer(QWidget*, QGLWidget const*, QFlags<Qt::WindowType>)':
glviewer.cpp:(.text+0x18): undefined reference to `vtable for GLViewer'
glviewer.cpp:(.text+0x20): undefined reference to `vtable for GLViewer'

编辑: 这是.pro文件的内容:

QT       += core gui opengl xml

TARGET = qglviewer-test
TEMPLATE = app

LIBS += -lqglviewer-qt4 -lGLU -lGLEW

SOURCES += main.cpp\
        mainwindow.cpp \
        glviewer.cpp

HEADERS  += mainwindow.h \
        glviewer.cpp

FORMS += mainwindow.ui

【问题讨论】:

你能发布所有方法的实现吗? 【参考方案1】:

您没有发布您的 GLViewer 类的完整实现(仅构造函数),但出现此错误的原因:

undefined reference to `vtable for GLViewer'

是你没有实现一些虚函数(我假设initializeGL()resizeGL(int width, int height)paintGL())。

【讨论】:

@sorush-r:你确定你已经实现了所有这些吗?也许您忘记将GLViewer:: 放在其中一个定义中?【参考方案2】:

您没有通过 moc 运行 glviewer.h。这就是错误所说的。在您的 .pro 文件中,更改

HEADERS  += mainwindow.h \
        glviewer.cpp

HEADERS  += mainwindow.h \
        glviewer.h               <------

【讨论】:

【参考方案3】:

正如 VJovic 所说,这种问题通常是由未实现的虚函数引起的。我注意到没有 GLViewer 析构函数的声明/定义。 QGLViewer 的析构函数是virtual 函数吗?如果是这种情况,请尝试为GLViewer 类提供析构函数,这可能会解决您的问题。

【讨论】:

但是GLViewer 类的默认析构函数将是虚拟的,不是吗? @VJovic 如果 OGLViewer 的析构函数被声明为虚拟,~GLViewer 是虚拟的。否则不行。 @sorush-r 我猜 Marco Q_OBJECT 有问题。看看这个帖子:***.com/questions/4774291/…,希望对你有用。 @LeiMou dtor of QGLWidget 被声明为虚拟。

以上是关于链接器错误:未定义对“QGLViewer 的 vtable”的引用的主要内容,如果未能解决你的问题,请参考以下文章

链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用

未定义对向量<String> g++ 链接器错误的引用[重复]

STM32 GNU ARM 链接器:使用 eclipse 对函数()的未定义引用

链接器错误:未定义的引用

链接器错误 - 未定义的引用

链接器错误 - 未定义的符号