Question

I'm struggling to get a subclass of QGLWidget compiled that uses glew. I'm running Qt 5.0.1 + MinGW 4.7 on Windows 7. Glew 1.7.0 has been compiled with said MinGW.

I have subclassed QGLWidget with UGGLWidget and included "GL/glew.h" before the QGLWidget includes. When compiling I get 200 Errors about:

  • 'function' redeclared as different kind of symbol
  • conflicting declaration 'typedef'

So my Question: How do I get a subclass of QGLWidget that uses glew compiled under Qt5?


Edit: I tried the same approach with another setup (Qt4.7 + MinGW4.4). It compiles and runs just fine. I have also tried using a more recent version of glew (Qt5.0.1 + MinGW4.7 + glew1.9.0) this doesn't compile either and gives the same compilation errors.


Here's a messy snippet of the compiler output:

> 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*)'

Last but not least the header and source file of the subclass. It's really just empty for now.

Source:

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

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

Header:

//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

Oh, and maybe relevant parts from the .pro file

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)
Was it helpful?

Solution

The following fixed my problem, this goes everywhere, where I include glew:

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

Another option: building Qt5.0.1 from source with -opengl desktop during the configure step.


For some reason QT_OPENGL_ES_2 is defined in my Qt5.0.1 installation. Looking through the inlcudes from QGLWidget.h I found the following in 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

This leads to inclusion of GLES2/gl2.h which doesn't get along with glew. Knowing that the issue was related to GLES2 I came across a bug report and a QtProject post. If I understand correctly, then the provided QtSDK installer for Qt5.0.1 has been built such that GLES is enabled.

Have a good day,
~Moritz

OTHER TIPS

Note that QT 4.8RC release notes say: Including QtOpenGL will not work in combination with GLEW, as QGLFunctions will undefine GLEW's defines.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top