2013-09-28 14 views
6

Sto lavorando a un'applicazione SDL2 utilizzando il profilo core OpenGL 3.2. Quando compilo, ottengo il seguente avvertimento:SDL2, Mac OS X e OpenGL: come evitare di includere sia gl.h che gl3.h?

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2: avvertimento: #WARNING gl.h e gl3.h sono entrambi inclusi. Il compilatore non invocherà errori se si utilizza la funzionalità OpenGL rimossa. [-Wcpp]

devo supporre che SDL è compreso gl.h da qualche parte, perché la mia include solo sono i seguenti:

#define GL3_PROTOTYPES 

#include <OpenGL/gl3.h> 
#include <SDL2/SDL.h> 

Mentre posso semplicemente ignorare questo, che ha già portato a un bug difficile da trovare quando ho usato per errore un valore enum non disponibile nel profilo principale. C'è un modo per evitare che gl.h venga incluso?

risposta

11

Dai uno sguardo allo /System/Library/Frameworks/OpenGL.framework/Headers/gl.h, dovresti vedere uno standard abbastanza completo di guardia sulla prima riga: #ifndef __gl_h_. Se guardi allo gl3.h noterai una protezione di tipo ugualmente standard per __gl3_h_. Questo avviso viene attivato solo quando entrambi sono definiti e GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED non è definito.

Il modo più semplice per impedire l'inclusione di qualsiasi cosa dall'interno di gl.h è #define __gl_h_ prima che venga incluso. Per evitare di rovinare il codice vero e proprio con qualcosa di brutto come:

#ifdef __APPLE__ 
# define __gl_h_ 
# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 
#endif 

vorrei suggerire di aggiungere -D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED come opzione del compilatore per il vostro Makefile quando si target OS X (in modo che non importa dove gl.h è indirettamente inclusa da, non fa mai niente). Questo non è il modo giusto per affrontarlo e questo avviso è stato generato per un motivo (che hai evidenziato nella tua domanda - i token OpenGL deprecati non generano avvisi/errori del compilatore quando entrambe le intestazioni sono incluse).

Penso che lo stesso SDL2 dovrebbe avere un meccanismo di pre-processore per fare ciò che ho fatto in precedenza con #ifdef __APPLE__ ma, al posto di quello, questo avrà il compito. Non è un errore in alcun modo includere entrambi, OS X fornisce solo un pratico meccanismo per generare errori del compilatore quando i token deprecati (ad esempio GL_MODELVIEW) vengono utilizzati in un progetto che dovrebbe essere il core 3+.

Su altre piattaforme, se si utilizza core OpenGL 3+ non è così bianco e nero in fase di compilazione, quindi il compilatore non può essere utilizzato per questo scopo. È una di quelle cose che Apple fa solo perché possono; "pensa diversamente."

+0

Ottima risposta. Sembra che la definizione di '__gl_h_' causi alcuni problemi internamente in SDL, ma questo è un problema separato. Vedrò cosa posso trovare direttamente dalla loro comunità. – Karl