Ошибка ссылки Qt 5.5 QOpenGLWidget, не связывающая вызовы openGL

Я попытался создать простое приложение OpenGL с Qt 5.5.1, и все в порядке, пока я не попытаюсь использовать собственные вызовы функций openGL, такие как glClearColor.

виджет фактически компилируется и создает черный экран, но после того, как я пытаюсь использовать любую собственную функцию 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

Я использую настольный комплект Qt mingw492_32. Но странно то, что я не нашел libQtOpenGL.Итак, в папке lib. Моя установка QT неисправна? Я пытался установить его несколько раз, но это не помогло. Где я могу скачать эту конкретную библиотеку?

связывание его с проектом решило бы проблему, но я не могу найти его нигде.

проблема в том, что модуль openGL отсутствует в установке QT,это не что я не могу связать с ним.

1 ответов


после того, как я случайно открыл пример программы, просто чтобы взглянуть на реализацию; я обнаружил, что то же самое QOpenGLWidget была реализована в новом примере программы.

после небольшого анализа мне удалось выяснить проблему.

QT имеет внутреннюю реализацию openGL и собственную поддержку openGL. Виджет, который я использовал, унаследован от QOpenGLWidget, но функция openGL вызывает (например,glClearColor) попытался получить доступ к собственной реализации openGL в Qt. которые, поскольку они не были включены в мою сборку Qt, проект не будет строить.

чтобы исправить это, нужно либо запустить пользовательскую сборку ядра Qt, либо использовать оболочку openGL, предоставленную Qt.

я использовал оболочку Qt в конце, которая также использовалась в примере программы куб. класс, используемый для реализации виджета (называется 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);
}

надеюсь, это поможет кому-то еще.