2016-02-29 31 views
0

很抱歉,如果这是一个非常基本的问题,但我很困惑:
我使用Visual Studio和我创建一个自定义QOpenGLWidget类(从基类继承),和我的问题是:定制QOpenGLWidget和GLEW包括

  • 如果我在我的自定义类添加#include <QOpenGLWidget>,并且还添加了#includeglew.h,我可以访问glew.h
  • 定义的东西,但如果我在我的自定义类中添加#include <QtWidgets>(我虽然会覆盖QOpenGLWidget吨∞),那么我无法访问什么是glew.h定义,我看到“标识符未定义”错误(例如,为glGenVertexArrays

有人能告诉我什么,我在这里失踪?我猜测,包括我只需要(#include <QOpenGLWidget>)比<QtWidgets>中的很多东西要好,但为什么它应该阻止我访问glew.h中定义的内容?

任何帮助表示赞赏

+0

请注意'#include '意味着一个'#include ',它反过来''包括',它又包含一些OpenGL头文件。也许'glew.h'有一些'#ifndef'保护被触发。 – peppe

+0

顺便说一句,你确定你需要GLEW吗? – peppe

+0

@peppe我想我需要GLEW,因为我打电话直接OpenGL API函数,而且我没有使用Qt中的包装。我错过了什么吗? – Farzad

回答

1

不能同时包括Qt的OpenGL的包装OpenGL loading library头。不同的.cpp文件可以包含不同的标题,但相同的.cpp不能。所以你将不得不选择你想使用的:GLEW或者Qt的OpenGL包装器。

这是行不通的原因是因为装载机通常使用包含防护,防止您意外地包括<GL/gl.h>或类似的标头。加载库往往是独占的,因为它们通常定义与其他OpenGL头文件相同的符号。如果他们不阻止你这样做,如果你试图包含两者,你可能会得到多重定义的符号错误。

Qt的OpenGL包装本身就是一个加载库。所以它也有相同的排除技巧,定义了GLEW和其他装载机将使用的包含警卫。因此,您不能在同一个.cpp文件中使用两者。