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

时间:2013-09-28 22:20:18

标签: macos opengl 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>

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

2 个答案:

答案 0 :(得分:13)

看看/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 。为了避免弄乱你的实际代码,如:

-D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED

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

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

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

答案 1 :(得分:1)

此警告在SDL2的2.0.4版本候选版中消失。 在SDL邮件列表上共享了发布候选版本的临时链接。 http://forums.libsdl.org/viewtopic.php?t=11305