[英]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.