Qt конфликтует с GLee - PullRequest
       24

Qt конфликтует с GLee

5 голосов
/ 29 мая 2009

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

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

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

Ответы [ 4 ]

3 голосов
/ 02 июня 2009

Это все еще не так чисто, как хотелось бы, но, по крайней мере, он собирается и работает без взлома 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 тот файл последним.

2 голосов
/ 24 февраля 2012

Другое решение (все-таки очень некрасиво, но, похоже, все решения, кроме использования 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>
1 голос
/ 02 июня 2009

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

( Редактировать: Я больше не подозреваю, что после прочтения одного из ваших комментариев - если все, что вы извлекли из GLee.h - это проверки и директивы #error, все должно работать ... Вероятно. )

Насколько я могу судить, проблема в том, что Qt пытается определить перечисления, которые конфликтуют с макросами препроцессора X. В частности, CursorShape определяется X.h как 0, а затем как qnamespace.h как перечисление, что приводит к довольно бесполезному сообщению об ошибке «error: ожидаемый идентификатор перед числовой константой»

Более чистый способ сделать то, что вы пытаетесь сделать, это включить файлы в следующем порядке, и эти макросы не определены:

#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 - это даст вам предварительно обработанный источник, который вы можете проверить, чтобы найти строку, вызывающую сбой. В этом случае имя enum было заменено константой 0, что давало понять, что имя определяется в другом месте. В результате поиска имени enum в / usr / include был обнаружен заголовок ошибки X.h. Что ж, если честно, неприятной парой здесь является Qt - разработчики должны знать лучше, чем использовать константы X11 в качестве идентификаторов в кроссплатформенной среде.

0 голосов
/ 01 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...