2009-05-29 2 views
5

Я добавляю поддержку OpenGL в игру, основанную на Qt 3 (офисная политика). Основы (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 

Это не строит (не знаю, будет ли мой код на самом деле запустить еще ... упреждающий на этот вопрос в [т.е. я проволочки]), но это, кажется, как попало ляп. В Googling появилось много людей, которые задавали этот основной вопрос (хотя большинство из них не потрудились выяснить ошибки фальшивых компиляторов, чтобы они могли увидеть проблему с корнем), но я не видел никаких реальных ответов.

Есть ли лучший (более элегантный, портативный, надежный и т. Д.) Способ сделать это?

+0

Это звучит подозрительно. Что заставляет вас думать, что каждый заголовок должен быть включен перед другим? Какие ошибки вы получаете? –

+0

GLee.h имеет предварительные проверки, поэтому он должен быть включен первым (это то, что я вытащил, чтобы получить этот хак для сборки). Когда я включаю стандартный GLee.h, я получаю ошибки от qevent.h (а иногда и qnamespace.h) о числовых константах и ​​«другом», используемых вне класса (наряду с другими, которые подразумевают отсутствие) где-то). http://www.qtcentre.org/forum/f-general-programming-9/t-problems-with-q-object-and-subclassing-823.html имеет хороший список ошибок, но это исправление не помогло меня. – James

+0

Помогла ли одна из ваших проблем решить вашу проблему? Можете ли вы пометить один, как принято тогда? –

ответ

0

Короткий ответ: используйте glew. он отлично работает с QT.

1

Я подозреваю, что ваш патч не будет работать, поскольку он предотвращает включение необходимых заголовков. Это может вызвать всевозможные странные проблемы.

(Edit:. я больше не подозреваем, что после прочтения одного из ваших комментариев - если все, что вы вытащили из 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. Ну, честно говоря, оскорбительный pary здесь 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 
{ 
... 
} 

то файл Soure бы #include файл последнего.

+0

Что в этом плохого? Выглядит так же хорошо, как вы можете надеяться, что 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> 
+0

Привет, только столкнулся с этой проблемой с GLee 5.5 и Qt5.1.1. Я бы добавил '#undef Expose' и' #undef Complex' в список проблемных макросов – Randi

+0

Спасибо, добавили их в список –

Смежные вопросы