2013-02-10 4 views
2

Я изо всех сил пытаюсь получить подкласс QGLWidget, скомпилированный с использованием glew. Я запускаю Qt 5.0.1 + MinGW 4.7 в Windows 7. Glew 1.7.0 был скомпилирован с указанным MinGW.Как подкласс QGLWidget использовать glew?

У меня есть подкласс QGLWidget с UGGLWidget и включен "GL/glew.h" перед включением QGLWidget. При компиляции я получаю 200 ошибки о:

  • «функция» повторно объявлен в качестве различного рода символ
  • противоречивую декларацию «ЬурейеЕ»

Так что мой вопрос: Как я получить подкласс QGLWidget, который использует glew, скомпилированный под Qt5?


Edit: Я попробовал один и тот же подход, с другой установкой (Qt4.7 + MinGW4.4). Он компилируется и работает отлично. Я также попытался использовать более новую версию glew (Qt5.0.1 + MinGW4.7 + glew1.9.0), это не скомпилируется и дает те же ошибки компиляции.


Вот грязный фрагмент вывода компилятора:

> In file included from 
> ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include/QtGui/qopengl.h:55:0, 
>     from ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include\QtOpenGL/qgl.h:47, 
>     from ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include\QtOpenGL/QGLWidget:1, 
>     from src\UGGLWidget.h:4, 
>     from src\UGGLWidget.cpp:2: ..\..\..\..\..\..\Qt\Qt5.0.1\5.0.1\mingw47_32\include/GLES2/gl2.h:614:153: 
> error: 'void __glewVertexAttribPointer(GLuint, GLint, GLenum, 
> GLboolean, GLsizei, const GLvoid*)' redeclared as different kind of 
> symbol In file included from src\UGGLWidget.cpp:1:0: 
> ..\3rdPartyLibs\glew\include/GL/glew.h:13609:46: error: previous 
> declaration of 'void (__attribute__((__stdcall__)) * 
> __glewVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*)' 

Последний, но не менее заголовочный файл и источник подкласса. На самом деле это просто пусто.

Источник:

//UGGLWidget.cpp 
#include "GL/glew.h" 
#include "UGGLWidget.h" 

UGGLWidget::UGGLWidget(QWidget *parent) : QGLWidget(parent) { ... } 

Заголовок:

//UGGLWidget.h 
#ifndef UGGLWIDGET_H 
#define UGGLWIDGET_H 
#include <QGLWidget> 

class UGGLWidget : public QGLWidget 
{ 
    Q_OBJECT 
public: 
    explicit UGGLWidget(QWidget *parent = 0); 
}; 
#endif // UGGLWIDGET_H 

О, и, возможно, соответствующие части из .pro файла

QT  += core gui opengl 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 
LIBS += -L$$quote(../3rdPartyLibs/glew/lib/) -lglew32 
LIBS += -lopengl32 -lglu32 
INCLUDEPATH += $$quote(../3rdPartyLibs/glew/include) 
+0

Вы инициализировали GLEW? http://glew.sourceforge.net/basic.html – cmannett85

+0

@ cmannett85 Да, я делаю в initializeGL(). Хотя моя проблема уже заключается в компиляции подкласса. glewInit() должен иметь значение только во время выполнения. Я проясню это в вопросе, спасибо. –

+0

Я пробовал перебирать gotw alltogether и ставить свои ставки на QGLWidget, предоставляя всю необходимую мне функциональность, но это тоже не удалось. glPointSize, glDeleteVertexArrays и другие функции, относящиеся к массивам вершин, не объявляются внутри области QGLWidget. –

ответ

2

Ниже фиксированная моя проблема, это идет во всем мире, где я включаю glew:

#include "GL/glew.h" 
#define QT_NO_OPENGL_ES_2 

Другой вариант: построение Qt5.0.1 из источника с помощью -opengl desktop во время этапа настройки.


По какой-то причине QT_OPENGL_ES_2 определяется в моей установке Qt5.0.1. Просматривая из QGLWidget.h включает все я нашел следующее QtCore/qconfig.h

#if defined(QT_OPENGL_ES_2) && defined(QT_NO_OPENGL_ES_2) 
# undef QT_OPENGL_ES_2 
#elif !defined(QT_OPENGL_ES_2) 
# define QT_OPENGL_ES_2 
#endif 

Это приводит к включению GLES2/gl2.h которые не ладят с GLEW. Зная, что проблема связана с GLES2, я наткнулся на bug report и QtProject post. Если я правильно понял, то предоставленный установщик QtSDK для Qt5.0.1 был построен таким образом, что GLES включен.

Иметь хороший день,
~ Moritz

2

Обратите внимание, что примечания к выпуску QT 4.8RC ​​сказать: Включая QtOpenGL не будет работать в сочетании с GLEW как QGLFunctions будет неопределенное GLEW Определяет в.

Смежные вопросы