我尝试使用Qt 5.5.1构建一个简单的OpenGL应用程序,一切都很好,直到我尝试使用像glClearColor这样的openGL本机函数调用。
Widget实际编译并生成黑屏,但在我尝试使用任何openGL本机函数后,它甚至没有链接,但会产生错误:
glwidget.cpp:10: error: undefined reference to '_imp__glClearColor@16'
这是.pro文件:
QT += core gui opengl
CONFIG += windows
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Vehicle_simulation
TEMPLATE = app
SOURCES += main.cpp\
simulation.cpp \
glwidget.cpp
HEADERS += simulation.h \
glwidget.h
FORMS += simulation.ui
我正在使用Desktop Qt mingw492_32套件。 奇怪的是,我没有在lib文件夹中找到libQtOpenGL.so。我的QT安装有问题吗?我试图多次重新安装它,但它没有帮助。我在哪里可以下载该特定库?
将它链接到项目可以解决问题,但我似乎无法在任何地方找到它。
问题是QT安装中缺少openGL模块,它不是我无法链接到它。
答案 0 :(得分:8)
我偶然打开一个示例程序后,只是看看实现;我发现在新的示例程序中实现了相同的QOpenGLWidget
。
经过一番分析后,我设法找出问题所在。
QT还具有内部openGL实现和本机openGL支持。我使用的小部件继承自QOpenGLWidget
,但openGL函数调用(如glClearColor
)试图访问Qt中的本机openGL实现。由于那些不包含在我的Qt版本中,该项目无法构建。
要修复此问题,必须运行自定义Qt核心构建,或使用Qt提供的openGL包装器。
我最后使用了Qt包装器,示例程序Cube也使用了它。用于实现窗口小部件的类(在我的实现中称为GLWidget
)不仅要从QOpenGLWidget
继承,还要从QOpenGLFunctions
继承。我的实施中缺少后一部分。它的源代码如下:
glwidget.h(初始):
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLFunctions>
#include <QOpenGLWidget>
class GLWidget : public QOpenGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent);
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
};
#endif // GLWIDGET_H
glwidget.h(已修复):
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLFunctions>
#include <QOpenGLWidget>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent);
protected:
void initializeGL() Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
};
#endif // GLWIDGET_H
在使用任何gl *函数之前,必须调用函数initializeOpenGLFunctions();
,否则会弹出非常神秘的运行时错误。
即:
void GLWidget::initializeGL(){
initializeOpenGLFunctions();
glClearColor(1,0,0,1);
}
希望这也能帮助别人。