繁体   English   中英

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

[英]SDL2, Mac OS X, and OpenGL: How to avoid including both gl.h and gl3.h?

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

看一下/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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM