2009-05-29 16 views
5

Estoy agregando soporte OpenGL a un juego basado en Qt 3 (política de oficina). Lo básico (QGLWidget, etc.) funciona bien.Qt en conflicto con GLee

Para llegar a las extensiones de OpenGL, elegí arbitrariamente a GLee (compilado de fábrica, GLew no lo hizo).

GLee.h y qgl.h no funcionan bien juntos. AFAICT, cada uno debe estar incluido antes que el otro.

Quité las comprobaciones de preprocesamiento [que aseguran que se incluyen primero] fuera de GLee.h, inserté las directivas de preprocesamiento que usa antes de incluir los encabezados de OpenGL, y luego incluí qgl.h primero. En Linux, que se reduce a:

#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 

que construye (ni idea de si mi código funcionarán realmente sin embargo ... preventiva de esta pregunta [es decir, estoy de dilatar]), pero parece horrible kludge. Google ha encontrado a mucha gente haciendo esta pregunta básica (aunque la mayoría de ellos no se han molestado en descifrar los falsos errores del compilador para que puedan ver el problema raíz), pero no he visto ninguna respuesta real.

¿Existe alguna forma mejor (más elegante, portátil, robusta, etc.) para hacer esto?

+0

Esto suena sospechoso. ¿Qué te hace creer que cada encabezado debe estar incluido antes que el otro? ¿Cuáles son los errores que obtienes? –

+0

GLee.h tiene comprobaciones de precompilador, por lo que debe incluirse primero (que es lo que saqué para que se construya este truco). Cuando incluyo el GLee.h estándar primero, obtengo errores de qevent.h (y en ocasiones qnamespace.h) sobre las constantes numéricas y 'friend' utilizado fuera de clase (junto con otros que implican que falta alguno). http://www.qtcentre.org/forum/f-general-programming-9/t-problems-with-q-object-and-subclassing-823.html tiene una buena lista de errores, pero esa corrección no ayudó yo. – James

+0

¿Alguna de las respuestas resolvió su problema? ¿Puedes marcar uno como aceptado entonces? –

Respuesta

0

Respuesta corta: use glew. funciona bien con QT.

1

Sospecho que su parche no funcionará, ya que evita que se incluyan los encabezados necesarios. Esto puede causar todo tipo de problemas extraños.

(Editar:. ya no la sospecha de que, después de leer uno de sus comentarios - si todo lo que se retiró de GLee.h Cuando los controles y directivas #ERROR, deben funcionar las cosas ... Probablemente)

Hasta donde puedo decir, el problema se debe a que Qt intenta definir enumeraciones que entran en conflicto con las macros del preprocesador X. Específicamente, CursorShape se define por Xh como 0 y luego por qnamespace.h como una enumeración, lo que da como resultado el mensaje de error poco útil "error: identificador esperado antes de la constante numérica" ​​

Una manera más limpia de hacer lo que usted ' estamos tratando de hacer es incluir los archivos en este orden, y con estas macros indefinidos:

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

esto no requiere de parches GLee.h, pero puede producir resultados inesperados, dependiendo de por qué quiere GLee.h ser incluido primero.

Una mejor solución sería incluir GLee.h y qgl.h en unidades de compilación separadas, pero eso puede no ser posible.

Por cierto, una buena estrategia de depuración para este tipo de problema es pasar -E a gcc - esto le dará la fuente preprocesada, que puede examinar para encontrar la línea ofensiva. En este caso, el nombre enum fue reemplazado por una constante 0, que dejó en claro que el nombre se estaba definiendo en otro lugar. La ampliación del nombre de la enumeración en/usr/include reveló que el encabezado ofensivo es X.h. Bueno, para ser justos, el pary ofensor aquí es Qt: los desarrolladores deberían saber mejor que usar las constantes X11 como identificadores en un marco de plataforma cruzada.

3

Esto todavía no es tan limpio como me gustaría, pero al menos se construye y se ejecuta, sin hackear GLee.h.

Después de todo, #include qobject.h, GLee.h y qgl.h (en ese orden).

Por lo tanto, el archivo de cabecera podría ser similar

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

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

class MyGlWidget : public QGLWidget 
{ 
... 
} 

entonces el archivo # include soure habría dicho archivo pasado.

+0

¿Qué pasa con eso? Se ve tan bien como se puede esperar, dada la forma en que Trolltech eligió sus nombres de identificadores ... Es posible que desee agregar un comentario explicando el orden de inclusión, pero aparte de eso, está bien. –

2

Otra solución (Muy feo, todavía, pero hasta parecer todas las soluciones para ser salvo usando 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> 
+0

Hola, acabo de toparme con este problema con GLee 5.5 y Qt5.1.1. Agregaría '#undef Expose' y' #undef Complex' a la lista de macros problemáticas – Randi

+0

Gracias, las agregué a la lista –