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”冲突