2013-09-28 16 views
6

Ich arbeite an einer SDL2-Anwendung mit dem OpenGL 3.2 Core-Profil. Wenn ich kompilieren, erhalte ich die folgende Warnung:SDL2, Mac OS X und OpenGL: Wie vermeiden Sie es, sowohl gl.h als auch gl3.h einzubeziehen?

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2: Warnung: #WARNING gl.h und gl3.h sind beide enthalten. Der Compiler ruft keine Fehler auf, wenn die OpenGL-Funktionalität entfernt wird. [-Wcpp]

Ich muss davon ausgehen, dass SDL irgendwo einschließlich gl.h ist, weil meine einzige sind schließt wie folgt:

#define GL3_PROTOTYPES 

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

Während ich dies ignorieren einfach, hat es bereits zu Ein schwer zu findender Fehler, als ich versehentlich einen Aufzählungswert verwendete, der im Kernprofil nicht verfügbar war. Gibt es eine Möglichkeit, die Aufnahme von gl.h zu verhindern?

Antwort

11

Werfen Sie einen Blick auf /System/Library/Frameworks/OpenGL.framework/Headers/gl.h, sollten Sie eine hübsche Standard-Wache auf der ersten Zeile sehen: #ifndef __gl_h_. Wenn Sie auf gl3.h schauen, werden Sie einen gleichwertigen Standardschutz für __gl3_h_ bemerken. Diese Warnung wird nur ausgelöst, wenn beide definiert sind und GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED nicht definiert ist.

Der einfachste Weg zu verhindern, dass etwas aus gl.h enthält wäre #define __gl_h_, bevor es jemals enthalten ist. Um zu vermeiden, in Unordnung zu Ihrem eigentlichen Code mit etwas Gemeines wie:

#ifdef __APPLE__ 
# define __gl_h_ 
# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 
#endif 

würde ich vorschlagen, -D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED als Compiler-Schalter auf Ihr Makefile hinzuzufügen, wenn Sie O X Ziel (so dass, egal wo gl.h indirekt aus enthalten, es macht nie etwas). Dies ist wirklich nicht der richtige Weg, um dies anzugehen, und diese Warnung wurde aus einem bestimmten Grund erzeugt (was Sie in Ihrer Frage angemerkt haben - veraltete OpenGL-Token erzeugen keine Compiler-Warnungen/Fehler, wenn beide Header enthalten sind).

Ich denke, SDL2 selbst sollte einige Pre-Prozessor-Mechanismus zu tun haben, was ich oben mit #ifdef __APPLE__ getan habe, aber stattdessen wird dies die Arbeit erledigt. Es ist kein Fehler, beide einzubeziehen. OS X bietet nur einen praktischen Mechanismus zum Generieren von Compilerfehlern, wenn veraltete Token (z. B. GL_MODELVIEW) in einem Projekt verwendet werden, das Core 3+ sein soll.

Auf anderen Plattformen, ob Sie Kern OpenGL 3+ verwenden, ist nicht so schwarz und weiß zum Zeitpunkt der Kompilierung, so dass der Compiler nicht für diesen Zweck verwendet werden kann. Es ist eines dieser Dinge, die Apple tut, nur weil sie es können; "denke anders."

+0

Große Antwort. Es sieht so aus, als ob die Definition von '__gl_h_' intern einige Probleme in SDL verursacht, aber das ist ein separates Problem. Ich werde sehen, was ich direkt von ihrer Community finden kann. – Karl