我正在使用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被包括在内?
答案 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