2011-12-20 8 views
8

Tak więc próbuję przenieść mój kod OpenGL z Main() do konkretnej klasy, która będzie obsługiwać grafikę 3D tylko wtedy, gdy będzie to konieczne. Poprzednio górna część pliku main.cpp wyglądała następująco:#error gl.h zawarty przed glew.h

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <SFML/Graphics.hpp> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Game.h" 

To działało dobrze. Próbowałem przenieść cały kod związany z OpenGL do metod klasy Game. Więc usunąłem #define GLEW_STATIC i #include <GL/glew.h> z powyższego, i umieścić je w Game.h tak, że górna część Game.h teraz wygląda tak:

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <SFML/Graphics.hpp> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Environment.h" 

Kiedy próbuję skompilować, pojawia się błąd w tytule, #error gl.h included before glew.h.

Dlaczego tak się dzieje i jak mogę użyć kodu OpenGL (prawie) całkowicie wewnątrz funkcji konkretnej klasy bez tego zdarzenia?

EDIT:

Próbowałem również tę konfigurację w main.cpp, starając się upewnić, że nic nie obejmuje SFML przed GLEW.

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "Game.h" 
#include <SFML/Graphics.hpp> 

Niestety, to nie pomaga (nie ma w tym nic więcej, o czym nie wspomnę tutaj).

+0

Czy to oznacza, że ​​teraz # wliczasz glew.h dwa razy, raz z main.cpp i raz z game.h? Przypuszczam, że glew.h nie został napisany w tym celu (ani żaden strażnik, ani #pragma), więc musisz dodać własnych strażników lub zadbać o to, aby uwzględnić go dokładnie raz. – Rup

+0

@Rup GLEW ma #include guards. To jest jakaś inna biblioteka, która zawiera gl.h. Prawdopodobnie SFML. –

+0

Nie, usuwam go z main.cpp. Przypuszczam, że może to być SFML, ale miałem wrażenie, że nie zawiera ono automatycznie gl.h, ponieważ istnieją tam pewne tutoriale, które wymagają jawnego włączenia tego pliku. Poruszę się z tym i zobaczę, czy to rozwiązuje cokolwiek - ale nadal potrzebuję używać SFML w main.cpp, przynajmniej przy mojej obecnej konfiguracji. – GarrickW

Odpowiedz

14

Niektóre inne biblioteki zawierają gl.h. Domyślam się, że SFML. Upewnij się, że najpierw umieściłeś GLEW w Game.h i sprawdź miejsca, w których umieścisz Game.h, aby upewnić się, że nie zawierasz SFML lub czegoś innego, co zawiera gl.h przed Game.h.

Jeśli masz coś takiego:

#include <something_that_includes_gl.h> 
#include "Game.h" 

Będzie skutecznie zawierać gl.h przed GLEW.

+0

Próbowałem przenieść '#include" Game.h "' up above '#include ' wewnątrz main.cpp (będę edytować główny post w celu zademonstrowania), ale to nie miało znaczenia. Nie jestem do końca zaznajomiony z tym, w jaki sposób #wszystkie rzeczy działają, więc może być coś, czego mi brakuje. – GarrickW

+0

@GarrickW Może to jakiś inny nagłówek? Czy możesz sprawdzić zakładkę "Tworzenie dziennika" w Code :: Blocks i opublikować wiadomości, które wyglądają jak "W pliku zawartym od ..."? To może pomóc znaleźć winnego. –

+0

AH-HA! Znalazłem to - okazuje się, że problem był w Game.cpp. W tym miejscu z jakiegoś powodu zawarłem '' powyżej "Game.h". Nie wiedziałem, że pliki .cpp dla klas zostały skompilowane przed nagłówkami dla tej samej klasy, chociaż teraz o tym myślę ... Muszę się wiele nauczyć. Dzięki! – GarrickW

1

Myślę, że miałem ten problem również raz. Jest to spowodowane przez sposób, w jaki SFML (1.6?) Zawiera rzeczy OpenGL.

IIRC (od pewnego czasu nie potrzebuję już GLEW od czasu przejścia na SFML2) jest to spowodowane grafiką SFML Graphics.hpp, w tym GLEW.h. Nie powinno się to dziać z powodu włączenia strażników, ale myślę, że w niektórych wersjach może się to jeszcze zdarzyć. Możliwe, że całkowicie pominiesz nagłówek GLEW, ponieważ i tak jest on zawarty w SFML.

Którą wersję SFML używasz? 1.6, 2.0 lub 2.0 z nowym API? Ponadto, jaki jest powód używania GLEW? Coś, czego brakuje w SFML? Być może jest to coś, co zawiera najnowsza wersja, więc nie musisz go również uwzględniać.

Powiązane problemy