2

我正在努力获得一个使用 glew 编译的 QGLWidget 子类。我在 Windows 7 上运行 Qt 5.0.1 + MinGW 4.7。Glew 1.7.0 已经用所述 MinGW 编译。

我将 QGLWidget 与 UGGLWidget 子类化,并"GL/glew.h"在 QGLWidget 包含之前包含在内。编译时出现 200 个错误:

  • “功能”重新声明为不同类型的符号
  • 冲突的声明'typedef'

所以我的问题: 如何获得使用在 Qt5 下编译的 glew 的 QGLWidget 子类?


编辑:我用另一个设置(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)
4

2 回答 2

2

以下解决了我的问题,这无处不在,我包括 glew:

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

-opengl desktop另一种选择:在配置步骤中从源代码构建 Qt5.0.1 。


由于某种原因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 有关,我遇到了一个错误报告和一个QtProject 帖子。如果我理解正确,那么已经构建了为 Qt5.0.1 提供的 QtSDK 安装程序,以便启用 GLES。

祝你有美好的一天,
~莫里茨

于 2013-02-13T00:13:46.730 回答
2

请注意,QT 4.8RC 发行说明说:包括 QtOpenGL 将无法与 GLEW 结合使用,因为 QGLFunctions 将取消定义 GLEW 的定义。

于 2013-04-27T22:09:47.273 回答