Qt与GLee冲突

时间:2009-05-29 14:34:44

标签: qt opengl

我正在为基于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

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

是否有更好的(更优雅,更便携,更健壮等)的方式来做到这一点?

4 个答案:

答案 0 :(得分:3)

这仍然不像我想的那么干净,但它至少可以构建和运行,而不会攻击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该文件最后。

答案 1 :(得分: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>

答案 2 :(得分:1)

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

编辑:我不再怀疑,在阅读了你的一条评论之后 - 如果你从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常量作为标识符更好。

答案 3 :(得分:0)

简短回答:使用glew。 QT可以正常使用。