SDL2,Mac OS X和OpenGL:如何避免同时包含gl.h和gl3.h?

Kar*_*arl 8 opengl macos sdl sdl-2

我正在使用OpenGL 3.2核心配置文件处理SDL2应用程序.编译时,我收到以下警告:

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2:警告:#warning gl.h和gl3.h都包括在内.如果使用已删除的OpenGL功能,编译器将不会调用错误.[-Wcpp]

我必须假设SDL在某处包含gl.h,因为我的唯一包括如下:

#define GL3_PROTOTYPES

#include <OpenGL/gl3.h>
#include <SDL2/SDL.h>
Run Code Online (Sandbox Code Playgroud)

虽然我可以简单地忽略这一点,但是当我意外地使用核心配置文件中没有的枚举值时,它已经导致了一个难以发现的错误.有没有办法阻止gl.h被包括在内?

And*_*man 15

看一看/System/Library/Frameworks/OpenGL.framework/Headers/gl.h,你应该在第一行看到一个非常标准的包括警卫:#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
Run Code Online (Sandbox Code Playgroud)

-D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED当你定位OS X时,我建议将你的Makefile 添加为Makefile(这样无论在哪里gl.h间接包含它,它都不会做任何事情).这实际上不是解决这个问题的正确方法,并且出于某种原因生成警告(您在问题中指出了这一点) - 当包含两个标头时,弃用的OpenGL标记不会生成编译器警告/错误.

我认为SDL2本身应该有一些预处理器机制来完成我上面所做的事情,#ifdef __APPLE__但取而代之的是,这将完成工作.通过任何方式包含两者都不是错误,OS X只是提供了一个方便的机制来生成编译器错误,当不推荐使用的令牌(例如GL_MODELVIEW)被用在一个应该是核心3+的项目中时.

在其他平台上,无论您使用的是核心OpenGL 3+在编译时都不是那么黑白,因此编译器不能用于此目的.这是苹果公司所做的事情之一,因为它们可以; "想想不同."