Ошибка ссылки 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);
}
надеюсь, это поможет кому-то еще.