Qt 5.5 QOpenGLWidget link 错误未 linking 任何 openGL 调用

Qt 5.5 QOpenGLWidget link error not linking any openGL calls

我尝试使用 Qt 5.5.1 构建一个简单的 OpenGL 应用程序,在我尝试使用 openGL 本机函数调用(如 glClearColor)之前一切正常。

Widget 实际上会编译并产生黑屏,但在我尝试使用任何 openGL 原生函数后它甚至 link 都没有,而是产生错误:

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

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

link将它添加到项目中可以解决问题,但我似乎无法在任何地方找到它。

问题是 QT 安装中缺少 openGL 模块,不是我无法link它。

偶然打开了一个示例程序,只是为了看一下实现;我发现在新的示例程序中已经实现了相同的 QOpenGLWidget

经过一番分析,我设法找出了问题所在。

QT 具有内部 openGL 实现和本机 openGL 支持。我使用的小部件继承自 QOpenGLWidget,但 openGL 函数调用(如 glClearColor)试图访问 Qt 中的本机 openGL 实现。由于这些未包含在我的 Qt 构建中,因此该项目不会构建。

要解决此问题,必须 运行 自定义 Qt 核心构建,或使用 Qt 提供的 openGL 包装器。

最后我用的是Qt wrapper,示例程序也用到了Cube。用于实现小部件的 class(在我的实现中称为 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();,否则会弹出一个非常神秘的 运行-time 错误。 即:

void GLWidget::initializeGL(){
    initializeOpenGLFunctions();
    glClearColor(1,0,0,1);
}

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