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

时间:2015-11-05 16:56:59

标签: c++ qt opengl desktop

我尝试使用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模块,它不是我无法链接到它。

1 个答案:

答案 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);
}

希望这也能帮助别人。