看看/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+在編譯時都不那麼黑白,所以編譯器不能用於此目的。這是蘋果公司所做的一件事,只是因爲他們可以; 「認爲不同。」
很好的答案。看起來定義'__gl_h_'會在SDL內部導致一些問題,但這是一個單獨的問題。我會看到我可以直接從他們的社區找到什麼。 – Karl