簡體   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