Qt 5.5 QOpenGLWidget链接错误没有链接任何openGL调用

Dav*_*óth 6 c++ opengl desktop qt

我尝试用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
Run Code Online (Sandbox Code Playgroud)

我正在使用Desktop Qt mingw492_32套件.奇怪的是,我没有在lib文件夹中找到libQtOpenGL.so.我的QT安装有问题吗?我试图多次重新安装它,但它没有帮助.我在哪里可以下载该特定库?

将它链接到项目将解决问题,但我似乎无法在任何地方找到它.

问题是QT安装中缺少openGL模块,并不是我无法链接到它.

Dav*_*óth 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

小心!

在使用任何gl*函数之前initializeOpenGLFunctions();,必须调用该函数,否则会弹出非常神秘的运行时错误.即:

void GLWidget::initializeGL(){
    initializeOpenGLFunctions();
    glClearColor(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)

希望这对其他人也有帮助.