2013-09-28 77 views
6

我正在使用OpenGL 3.2核心配置文件處理SDL2應用程序。當我編譯,我得到以下警告:SDL2,Mac OS X和OpenGL:如何避免包含gl.h和gl3.h?

/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被包含?

回答

11

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

我建議增加-D__gl_h_ -DGL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED作爲一個編譯器開關,以你的Makefile當你的目標OS X(所以無論在哪裏gl.h間接從包括,它從來沒有做任何事情)。這實際上並不是解決這個問題的正確方法,而且這個警告是由於某個原因而產生的(您在問題中指出了這一點 - 當包含兩個頭文件時,不推薦使用的OpenGL令牌不會生成編譯器警告/錯誤)。

我認爲SDL2本身應該有一些預處理器機制來完成我上面做的#ifdef __APPLE__,但是取而代之的是,這將完成工作。包括兩者都不是一個錯誤,OS X只是提供了一個方便的機制,當被棄用的標記(例如GL_MODELVIEW)被用於被認爲是核心3+的項目中時,會產生編譯器錯誤。

在其他平臺上,無論您使用的是核心OpenGL 3+在編譯時都不那麼黑白,所以編譯器不能用於此目的。這是蘋果公司所做的一件事,只是因爲他們可以; 「認爲不同。」

+0

很好的答案。看起來定義'__gl_h_'會在SDL內部導致一些問題,但這是一個單獨的問題。我會看到我可以直接從他們的社區找到什麼。 – Karl