2013-06-15 15 views
10

Tak,Redefinicja nagłówków GLEW i Qt5

Po aktualizacji naszego prtu do Qt5 mamy problemy z glew. Aplikacja łączy bibliotekę, która musi działać, i działa dobrze, gdy używa się biblioteki w aplikacjach innych niż Qt.

Teraz jednak jesteśmy łączenie biblioteki do qt aplikacji i renderowania do glwidget. To działało, ale teraz nie robi. Dostajemy ogromną liczbę błędów, które najczęściej mówią "redefinicja" czegoś. Oto kilka przykładów:

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 

Masz pomysł. W każdym razie, jak mogę zatrzymać Qt, w tym jego gl rzeczy, więc dmuchnął może działać sam?

Jak widać gles jest istota problemu, więc został skierowany do wykorzystania to:

#define QT_NO_OPENGL_ES_2 

Ale to nie ma znaczenia w ogóle. Istnieją inne błędy, które nie odnoszą się do takich kodów:

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' 

Mamy nadzieję, że możesz pomóc!

Odpowiedz

4

Po dniu wkręcania wokół mam rozwiązanie!

Aby być wieloplatformowym Qt wydaje się mieć ustawione OpenGLES o wysokim priorytecie niż pulpitu OpenGL.

Rozwiązaniem tego problemu jest budowa Qt z kodu źródłowego pozywa zachodzącego -opengl desktop przed budować. Coś w tym stylu:

configure -debug-and-release -opengl desktop 

Następnie użyj nmake do zbudowania i działa dobrze!

+0

Czy możesz wyjaśnić, jak to zrobić w Qt? Lub bardziej gadatliwą odpowiedź na pytanie, jak to zrobiłeś? – GraphicsMuncher

+1

Pracowałem dla mnie. Widziałem podobny problem z budowaniem VS2012 z 32-bitowymi plikami EXE i OpenGL (zamiast ANGLE). Moja pełna linia poleceń do budowania źródła z wiersza poleceń VS2012 to: 'configure -prefix c: \ Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012_opengl -mp -debug-and-release -opengl desktop -C++ 11 - opensource -D _CRT_SECURE_NO_WARNINGS -domake examples -skip qtwebkit-examples && nmake && nmake install' – metal

4

Moje osobiste podejście z użyciem OpenGL z Qt jest oddzielenie wszystkie OpenGL związanych z realizacją część klasy Qt. W części Qt po prostu wzywam do neutralnego kodu OpenGL o strukturze kodu poprzez zwykłe interfejsy C lub C++, używając standardowych typów. Ponieważ rzeczywisty kod OpenGL nie odwołuje się do Qt, nie musi zawierać nagłówków Qt, unikając problemów takich jak twój.

+0

Rzeczywiście potrzebuję qt, ponieważ używam QGLWidget do renderowania. Naprawiłem to, odbudowując Qt. Wezwę poprawną odpowiedź. – Constan7ine

+1

@DavidC: Nadal można korzystać z QGLWidget. Umieść swój kod OpenGL w oddzielnej jednostce kompilacji i nagłówku (np. 'Glrenderer.h'' glrenderer.cc'), która nie używa Qt i w klasie pochodnej QGLwidgt wywołaj funkcje z jednostki kompilacji 'glrenderer.cc'. – datenwolf