Подтвердить что ты не робот

GLEW и Qt5 переопределение заголовков

Итак,

После обновления нашего prject до Qt5 у нас возникают проблемы с glew. Приложение связывает библиотеку, которая нуждается в glew для работы, и это отлично работает при использовании библиотеки в приложениях, отличных от Qt.

Теперь, хотя мы связываем библиотеку с Qt-приложением и визуализацией в glwidget. Это работало, но теперь это не так. Мы получаем огромное количество ошибок, которые в основном говорят "переопределить" что-то. Вот несколько примеров:

 1>c:\glew-1.9.0\include\gl\glew.h(275): error C2371: 'GLdouble' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\qtgui\qopengl.h(71) : see declaration of 'GLdouble'
1>c:\glew-1.9.0\include\gl\glew.h(630): warning C4005: 'GL_DOUBLE' : macro redefinition
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\qtgui\qopengl.h(68) : see previous definition of 'GL_DOUBLE'
1>c:\glew-1.9.0\include\gl\glew.h(1655): error C2371: 'GLintptr' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(38) : see declaration of 'GLintptr'
1>c:\glew-1.9.0\include\gl\glew.h(1656): error C2371: 'GLsizeiptr' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(39) : see declaration of 'GLsizeiptr'
1>c:\glew-1.9.0\include\gl\glew.h(1707): warning C4005: 'GL_BLEND_EQUATION_RGB' : macro redefinition
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(96) : see previous definition of 'GL_BLEND_EQUATION_RGB'
1>c:\glew-1.9.0\include\gl\glew.h(11533): warning C4005: 'GL_COVERAGE_SAMPLES_NV' : macro redefinition

Вы получаете идею. Во всяком случае, как я могу остановить Qt, включая его gl, так что glew может работать сам по себе?

Как вы можете видеть, gles является проблемой, поэтому мне было предложено использовать это:

#define QT_NO_OPENGL_ES_2

Но это не имеет никакого эффекта. Существуют и другие ошибки, которые не ссылаются на такие символы:

    1>c:\glew-1.9.0\include\gl\glew.h(275): error C2371: 'GLdouble' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\qtgui\qopengl.h(71) : see declaration of 'GLdouble'
1>c:\glew-1.9.0\include\gl\glew.h(630): warning C4005: 'GL_DOUBLE' : macro redefinition
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\qtgui\qopengl.h(68) : see previous definition of 'GL_DOUBLE'
1>c:\glew-1.9.0\include\gl\glew.h(1655): error C2371: 'GLintptr' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(38) : see declaration of 'GLintptr'
1>c:\glew-1.9.0\include\gl\glew.h(1656): error C2371: 'GLsizeiptr' : redefinition; different basic types
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(39) : see declaration of 'GLsizeiptr'
1>c:\glew-1.9.0\include\gl\glew.h(1707): warning C4005: 'GL_BLEND_EQUATION_RGB' : macro redefinition
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\gles2\gl2.h(96) : see previous definition of 'GL_BLEND_EQUATION_RGB'
1>c:\glew-1.9.0\include\gl\glew.h(11533): warning C4005: 'GL_COVERAGE_SAMPLES_NV' : macro redefinition
1>          c:\qt\qt5.0.2\5.0.2\msvc2012_64\include\qtgui\qopengles2ext.h(530) : see previous definition of 'GL_COVERAGE_SAMPLES_NV'

Надеюсь, вы сможете помочь!

4b9b3361

Ответ 1

После дня завинчивания у меня есть решение!

Для того, чтобы быть кросс-платформой, Qt, похоже, поставил OpenGLES на высокий приоритет, чем рабочий стол openGL.

Это решение состоит в том, чтобы построить Qt из исходного кода, удовлетворяющего настройке -opengl desktop перед созданием. Что-то вроде этого:

configure -debug-and-release -opengl desktop

Затем используйте nmake для сборки, и он отлично работает!

Ответ 2

Мой личный подход с использованием OpenGL с Qt заключается в том, чтобы отделить всю связанную с OpenGL часть от реализации класса Qt. В части Qt я затем просто вызываю в нейтральный нейтральный код OpenGL с помощью обычных интерфейсов C или С++, используя стандартные типы. Поскольку фактический код OpenGL не ссылается на Qt, он не должен включать заголовки Qt, избегая проблем, подобных вашим.