2011-12-20 17 views
8

Quindi sto provando a spostare il mio codice OpenGL da Main() in una classe specifica che gestirà la grafica 3D solo quando necessario. In precedenza, la parte superiore del mio file main.cpp assomigliava a questo:#error gl.h incluso prima di glew.h

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

Questo ha funzionato abbastanza bene. Quello che ho cercato di fare è stato spostare tutto il codice relativo a OpenGL in metodi della classe Game. Così ho rimosso #define GLEW_STATIC e #include <GL/glew.h> da quanto sopra, e metterle in Game.h, in modo tale che la parte superiore della Game.h ora assomiglia a questo:

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

Quando provo a compilare, ottengo l'errore titolo, #error gl.h included before glew.h.

Perché sta succedendo questo e come posso utilizzare il codice OpenGL (quasi) interamente all'interno delle funzioni di una classe specifica senza che ciò accada?

EDIT:

Ho anche provato questa configurazione in main.cpp, nel tentativo di assicurarsi che nulla comprende SFML prima GLEW.

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

Purtroppo, che non aiuta (non c'è niente altro essere inclusi che non sto menzionare qui).

+0

Ciò significa che ora si include #include glew.h due volte, una volta da main.cpp e una volta da game.h? Immagino che glew.h non sia scritto per questo (né guardie né #pragma), quindi dovrai aggiungere le tue guardie o occuparti di includerlo esattamente una volta. – Rup

+0

@Rup GLEW ha # include protezioni. È un'altra libreria che include gl.h. Forse SFML. –

+0

No, lo rimuovo da main.cpp. Suppongo che potrebbe essere SFML, ma ho avuto l'impressione che non includesse automaticamente gl.h, dal momento che ci sono alcuni tutorial in giro che vogliono che tu includa esplicitamente quel file. Ci giocherò con questo e vedrò se questo risolva qualsiasi cosa - ma ho ancora bisogno di usare SFML in main.cpp, almeno con la mia attuale configurazione. – GarrickW

risposta

14

Un'altra libreria include gl.h. La mia ipotesi sarebbe SFML. Assicurati di includere prima GLEW in Game.h e controlla i luoghi in cui includi Game.h per assicurarti di non includere SFML o altro che includa gl.h prima di Game.h.

Se hai qualcosa di simile:

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

Esso comprenderà efficacemente gl.h prima GLEW.

+0

Ho provato a spostare '#include" Game.h "' sopra '#include ' all'interno di main.cpp (dovrò modificare il post principale per dimostrare), ma ciò non ha fatto alcuna differenza. Non ho familiarità con il modo in cui le cose #include funzionano, quindi potrebbe esserci qualcosa che mi manca. – GarrickW

+0

@GarrickW Forse è un altro colpo di testa? Puoi controllare la scheda "Crea registro" in Code :: Blocks e pubblicare i messaggi che assomigliano a "Nel file incluso da ..."? Questo può aiutare a trovare il colpevole. –

+0

AH-HA! L'ho trovato - scopre che il problema era in Game.cpp. Lì, per qualche ragione, avevo incluso '' sopra "Game.h". Non conoscevo i file .cpp perché le classi venivano compilate prima delle intestazioni per la stessa classe, anche se ora che ci penso ... ho molto da imparare. Grazie! – GarrickW

1

Penso di aver avuto questo problema anche una volta. È in qualche modo causato dal modo in cui SFML (1.6?) Include la roba OpenGL.

IIRC (è passato un po 'di tempo e non ho più bisogno di GLEW dal passaggio a SFML2) è dovuto a SFML Graphics.hpp che include anche GLEW.h. Non dovrebbe accadere a causa di includere guardie, ma penso che con alcune versioni questo potrebbe ancora accadere. Potrebbe essere possibile saltare l'intestazione di GLEW completamente, poiché è comunque inclusa tramite SFML.

Quale versione di SFML stai utilizzando? 1.6, 2.0 o 2.0 con la nuova API? Inoltre, qual è la ragione per usare GLEW? Qualcosa che ti manca da SFML? Forse è qualcosa incluso nell'ultima versione, quindi ti impedisce di doverlo includere anche tu.