8

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

4

2 回答 2

16

看一下/System/Library/Frameworks/OpenGL.framework/Headers/gl.h,你应该会在第一行看到一个非常标准的 include 守卫:#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 为目标时将编译器开关添加到您的 Makefile 中(这样无论gl.h从哪里间接包含,它都不会做任何事情)。这确实不是解决此问题的正确方法,并且该警告的生成是有原因的(您在问题中指出了这一点-不推荐使用的 OpenGL 令牌在包含两个标头时不会生成编译器警告/错误)。

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

在其他平台上,您是否使用核心 OpenGL 3+ 在编译时并不是那么黑白分明,因此编译器不能用于此目的。这是 Apple 做的事情之一,因为他们可以;“想不同。”

于 2013-09-29T00:00:02.577 回答
1

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

于 2015-07-23T19:46:59.763 回答