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

9
我正在使用OpenGL 3.2核心版本开发SDL2应用程序。当我编译时,会收到以下警告:

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2: 警告: #warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality. [-Wcpp]

我必须假设SDL在某个地方包含了gl.h,因为我的唯一包含如下所示:
#define GL3_PROTOTYPES

#include <OpenGL/gl3.h>
#include <SDL2/SDL.h>

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

2个回答

17

请查看/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的Makefile中添加-D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED作为编译器开关(这样无论从哪里间接包含gl.h,它都不会起任何作用)。这确实不是解决该问题的正确方法,而警告也有其原因(正如您在问题中指出的那样 - 当两个头文件都被包含时,弃用的OpenGL令牌不会生成编译器警告/错误)。

我认为SDL2本身应该具有一些预处理机制,可以像我上面做的那样使用#ifdef __APPLE__,但如果没有,这将完成工作。在任何情况下,包括两个头文件并不是错误,OS X只是提供了一个方便的机制,在使用过时标记(例如GL_MODELVIEW)的项目中生成编译器错误,该项目应该是核心3+。

在其他平台上,是否使用核心OpenGL 3+在编译时并不那么黑白分明,因此编译器不能用于此目的。这是苹果之所以这样做的其中一件事; "think different."


很好的答案。看起来在SDL内部定义__gl_h_会引起一些问题,但这是一个单独的问题。我将直接从他们的社区中寻找相关信息。 - Karl

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接