2015-11-05 3 views
6

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

Виджет фактически собирает и производит черный экран, но после того, как я пытаюсь использовать любую родную функцию OPENGL она даже не ссылку, но выдает ошибку:

glwidget.cpp:10: error: undefined reference to '[email protected]'

Вот как .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.so в папке lib. Является ли моя установка QT неисправной? Я пытался переустановить его несколько раз, но это не помогло. Где я могу загрузить эту конкретную библиотеку?

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

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

+0

@genpfault, не быть придирчивым, но дублирующее предложение неверно. Я нашел источник проблемы, и потому, что QT по умолчанию строит с помощью ANGLE, который поддерживает OpenGL ES, а не desktop openGL. Чтобы решить эту проблему, я должен выполнить пользовательскую сборку QT Core с openGL. Я был бы более, чем рад ответить на вопрос, если кто-то столкнется с этой проблемой. –

+0

После открытия примера openGL-проекта, который скомпилирован и связан, я нашел источник проблемы, это не ошибка связывания, я использовал неправильную реализацию GLWIdget, я отправлю свой ответ, как только смогу скомпилировать достаточное количество мысли , –

ответ

8

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

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

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

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

В конце я использовал обертку 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); 
} 

Надеется, что это поможет кому-то еще, как хорошо.

+0

спасибо. это помогло. пожалуйста, подумайте над добавлением источника ссылки. – Tauqir

+0

Рад помочь! Одной из ссылок был бы следующий вопрос: http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls. Оттуда мне было любопытно увидеть классы, которые он использовал, заглядывал в источник и пробовал различные попытки, пока это не сработало. –

+1

версии qt до 5 включали в себя экспортную библиотеку для opengl в сборку, qt5 имеет собственную оболочку, которая построена по принципу правильности по производительности, поэтому вы вызываете методы класса или обертки, а не библиотечные функции. в обоих подходах есть достоинство – Swift