0

对不起,如果这是一个非常基本的问题,但我很困惑:
我正在使用 Visual Studio,我正在创建一个自定义QOpenGLWidget类(通过从基类继承),我的问题如下:

  • 如果我添加#include <QOpenGLWidget>我的自定义类,并添加#includefor glew.h,我可以访问定义的东西glew.h
  • 但是,如果我添加#include <QtWidgets>了我的自定义类(虽然我也会介绍QOpenGLWidget),那么我将无法访问其中定义的内容,glew.h并且我看到“标识符未定义”错误(例如, for glGenVertexArrays

有人可以告诉我我在这里缺少什么吗?我猜想包含我只需要的东西(#include <QOpenGLWidget>)比里面的很多东西要好<QtWidgets>,但是为什么它要阻止我访问里面定义的东西glew.h呢?

任何帮助表示赞赏

4

1 回答 1

1

您不能同时包含 Qt 的 OpenGL 包装器大多数OpenGL 加载库头文件。不同的 .cpp 文件可以包含不同的标头,但相同的 .cpp 不能。所以你必须选择你想要使用的东西:GLEW 或 Qt 的 OpenGL 包装器。

这不起作用的原因是因为加载程序通常使用包含防护来防止您意外包含<GL/gl.h>或类似的标题。加载库往往是排他性的,因为它们通常定义与其他 OpenGL 头文件相同的符号。如果他们没有阻止您这样做,如果您尝试同时包含两者,您可能会得到多重定义的符号错误。

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

于 2016-02-29T16:51:34.030 回答