看一下/System/Library/Frameworks/OpenGL.framework/Headers/gl.h
,你应该会在第一行看到一个非常标准的 include 守卫:#ifndef __gl_h_
. 如果你看一下,gl3.h
你会注意到一个同样标准的包含保护__gl3_h_
. GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
仅当两者都已定义和未定义时才会触发此警告。
防止从内部包含任何内容的最简单方法gl.h
是#define __gl_h_
在它被包含之前。为了避免用一些讨厌的东西弄乱你的实际代码,比如:
#ifdef __APPLE__
# define __gl_h_
# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
#endif
我建议-D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
当您以 OS X 为目标时将编译器开关添加到您的 Makefile 中(这样无论gl.h
从哪里间接包含,它都不会做任何事情)。这确实不是解决此问题的正确方法,并且该警告的生成是有原因的(您在问题中指出了这一点-不推荐使用的 OpenGL 令牌在包含两个标头时不会生成编译器警告/错误)。
我认为 SDL2 本身应该有一些预处理器机制来完成我上面所做的事情,#ifdef __APPLE__
但取而代之的是,这将完成工作。无论如何包含两者都不是错误,OS X 只是提供了一种方便的机制来GL_MODELVIEW
在应该是核心 3+ 的项目中使用不推荐使用的令牌(例如 )时生成编译器错误。
在其他平台上,您是否使用核心 OpenGL 3+ 在编译时并不是那么黑白分明,因此编译器不能用于此目的。这是 Apple 做的事情之一,因为他们可以;“想不同。”