2009-05-29 134 views
5

我正在爲基於Qt 3(辦公室政治)的遊戲添加OpenGL支持。基礎知識(QGLWidget等)工作正常。Qt與GLee衝突

爲了獲得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 

即構建(不知道我的代碼是否能實際運行尚未...這一問題的先發制人[即我拖延]),但它似乎是一個可怕的雜牌。谷歌搜索已經出現了很多人問這個基本問題(儘管他們大多沒有仔細研究編譯器錯誤的錯誤,以便他們可以看到根本問題),但我還沒有看到任何實際的答案。

有沒有更好的(更優雅,便攜,強大等)的方式來做到這一點?

+0

這聽起來很可疑。是什麼讓你相信每個標題必須包含在另一個之前?你得到的錯誤是什麼? – 2009-06-01 02:53:03

+0

GLee.h有預編譯器檢查,所以它必須首先包含(這是我拿出這個黑客建立)。當我首先包含標準GLee.h時,我從qevent.h(有時是qnamespace.h)中獲得有關數字常量和在類之外使用的「friend」(以及其他暗示缺失}的地方)的錯誤。 http://www.qtcentre.org/forum/f-general-programming-9/t-problems-with-q-object-and-subclassing-823.html有一個很好的錯誤列表,但該修復程序沒有幫助我。 – James 2009-06-01 15:11:47

+0

其中一個答案能解決你的問題嗎?你能標記一個被接受嗎? – 2013-09-17 08:15:30

回答

0

簡短回答:使用glew。它與QT一起工作得很好。

1

我懷疑你的補丁不起作用,因爲它會阻止包含必要的頭文件。這可能會導致各種奇怪的問題。

編輯:我不再懷疑,閱讀您的意見後一個 - 如果你掏出GLee.h的是檢查和#ERROR指令,事情應該工作。大概)

據我所知,問題源於Qt試圖定義與X預處理器宏衝突的枚舉。具體來說,CursorShape由Xh定義爲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

這仍然沒有我想要的那麼幹淨,但它至少可以構建並運行,而不會破解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 
{ 
... 
} 

那麼索裏的文件將#包括最後那個文件。

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>