链接器错误:未定义对“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++ 链接器错误的引用[重复]