Qt 与 GLee 冲突

Posted

技术标签:

【中文标题】Qt 与 GLee 冲突【英文标题】:Qt conflicting with GLee 【发布时间】:2009-05-29 14:34:43 【问题描述】:

我正在为基于 Qt 3(办公室政治)的游戏添加 OpenGL 支持。基础(QGLWidget 等)工作正常。

为了获得 OpenGL 扩展,我随意选择了 GLee(它是开箱即用的,而 GLew 没有)。

Glee.h 和 qgl.h 不能很好地结合在一起。 AFAICT,每个都必须在另一个之前包含。

我从 GLee.h 中抽出预处理检查 [确保首先包含它],在包含 OpenGL 头文件之前插入它使用的预处理指令,然后首先包含 qgl.h。在 linux 上,归结为:

    #define __glext_h_  /* prevent glext.h from being included  */
    #define __glxext_h_ /* prevent glxext.h from being included */
    #define GLX_GLXEXT_PROTOTYPES
#include <qgl.h>
#include "GLee.h" // my hacked version

构建(不知道我的代码是否真的会运行......这个问题是先发制人的[即我在拖延]),但这似乎是一个可怕的组合。谷歌搜索发现很多人都在问这个基本问题(尽管他们中的大多数人都没有费心找出虚假的编译器错误,因此他们可以看到根本问题),但我还没有看到任何实际答案。

有没有更好(更优雅、便携、健壮等)的方法来做到这一点?

【问题讨论】:

这听起来很可疑。是什么让您相信每个标题都必须在另一个之前包含?你得到什么错误? GLee.h 具有预编译器检查,因此必须首先包含它(这是我为构建此 hack 而提取的内容)。当我首先包含标准的 GLee.h 时,我从 qevent.h(有时是 qnamespace.h)收到关于数字常量和类外使用的“朋友”的错误(以及其他暗示某处缺少 的错误)。 qtcentre.org/forum/f-general-programming-9/… 有一个很好的错误列表,但该修复对我没有帮助。 其中一个答案是否解决了您的问题?那你能把一个标记为接受吗? 【参考方案1】:

这仍然没有我想要的那么干净,但它至少可以构建和运行,而不需要破解 GLee.h。

在其他所有内容之后,#include qobject.h、GLee.h 和 qgl.h(按此顺序)。

所以,头文件可能看起来像

...blah...
...other #includes

#include <qobject.h>
#include "GLee.h"
#include <qgl.h>

class MyGlWidget : public QGLWidget

...

那么源文件将最后#include 该文件。

【讨论】:

这有什么问题?鉴于 Trolltech 选择其标识符名称的方式,看起来和您希望的一样好...您可能想要添加注释来解释包含顺序,但除此之外它很好。【参考方案2】:

另一种解决方案(非常丑陋,仍然,但似乎所有解决方案都是除了使用 glew 之外):

#include <GL/GLee.h>
#include <GL/glu.h>

#undef Status
#undef Bool
#undef CursorShape
#undef Unsorted
#undef None
#undef KeyPress
#undef KeyRelease
#undef FocusIn
#undef FocusOut
#undef FontChange
#undef GrayScale
#undef Expose
#undef Complex

...

#include <qgl.h>

【讨论】:

您好,刚刚在 GLee 5.5 和 Qt5.1.1 中遇到了这个问题。我会将#undef Expose#undef Complex 添加到有问题的宏列表中 谢谢,已将它们添加到列表中【参考方案3】:

我怀疑您的补丁不起作用,因为它会阻止包含必要的标头。这可能会导致各种奇怪的问题。

(编辑:我不再怀疑,在阅读了你的一个 cmets 之后 - 如果你从 GLee.h 中提取的只是检查和 #error 指令,那么事情应该可以工作......可能.)

据我所知,问题源于 Qt 试图定义与 X 预处理器宏冲突的枚举。具体来说,CursorShape 由 X.h 定义为 0,然后由 qnamespace.h 定义为枚举,导致相当无用的错误消息“错误:数字常量之前的预期标识符”

一种更简洁的方法是按此顺序包含文件,并且未定义这些宏:

#include "qgl.h"
#undef __glext_h_
#undef __glxext_h_
#undef __gl_h_
#include "GLee.h"

这不需要修补 GLee.h,但可能会产生意想不到的结果,这取决于为什么要首先包含 GLee.h。

更好的解决方案是将 GLee.h 和 qgl.h 包含在单独的编译单元中,但这可能是不可能的。

顺便说一句,解决这类问题的一个很好的调试策略是将 -E 传递给 gcc - 这将为您提供预处理的源代码,您可以检查它以找到有问题的行。在这种情况下,枚举名称被替换为 0 常量,这清楚地表明该名称是在其他地方定义的。对 /usr/include 下的枚举名称进行搜索发现有问题的标头是 X.h。好吧,公平地说,这里有问题的是 Qt - 开发人员应该知道不要在跨平台框架中使用 X11 常量作为标识符。

【讨论】:

【参考方案4】:

简答:使用 glew。它适用于 QT。

【讨论】:

以上是关于Qt 与 GLee 冲突的主要内容,如果未能解决你的问题,请参考以下文章

std type_traits 与 Qt type_traits 冲突

在使用ubuntu16.04时候 qt4与qt5冲突导致的问题

求助,在VS2013环境里搭载QT老是出现模块计算机类型“X86”与目标计算机类型“x64”冲突

事件(QEvent*)与 mousePressEvent(QMouseEvent *)冲突?

QtOpengl 与 mac 上的 Opengl 框架冲突

qt中重写键盘事件冲突了