8

私は、OpenGL 3.2 コア プロファイルを使用して SDL2 アプリケーションに取り組んでいます。コンパイルすると、次の警告が表示されます。

/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:5:2: warning: #warning gl.h と gl3.h の両方が含まれています。削除された OpenGL 機能を使用している場合、コンパイラはエラーを呼び出しません。[-Wcpp]

私のインクルードは次のとおりであるため、SDLがgl.hをどこかにインクルードしていると想定する必要があります。

#define GL3_PROTOTYPES

#include <OpenGL/gl3.h>
#include <SDL2/SDL.h>

これは単純に無視できますが、コア プロファイルで使用できない列挙型の値を誤って使用すると、見つけにくいバグが 1 つ発生しました。gl.h が含まれないようにする方法はありますか?

4

2 に答える 2

16

を見てください。/System/Library/Frameworks/OpenGL.framework/Headers/gl.h最初の行にかなり標準的なインクルード ガードが表示されます#ifndef __gl_h_。を見るとgl3.h、同様に標準的なインクルードガード for に気付くでしょう__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_INCLUDEDOS X をターゲットにする場合は、コンパイラ スイッチとして Makefile に追加することをお勧めします (gl.h間接的にどこからインクルードされても、何もしないようにするため)。これは実際にこれに取り組むための正しい方法ではなく、その警告は理由で生成されました(質問で指摘しました-非推奨のOpenGLトークンは、両方のヘッダーが含まれている場合、コンパイラの警告/エラーを生成しません)。

SDL2 自体には、上記で行ったことを行うためのプリプロセッサ メカニズムが必要だと思います#ifdef __APPLE__が、その代わりに、これで作業が完了します。両方を含めることは決してエラーではありません。OS X は、非推奨のトークン (例: GL_MODELVIEW) がコア 3+ であると想定されるプロジェクトで使用された場合にコンパイラ エラーを生成する便利なメカニズムを提供します。

他のプラットフォームでは、コア OpenGL 3+ を使用しているかどうかはコンパイル時にそれほど白黒ではないため、この目的でコンパイラを使用することはできません。これは、Apple ができるという理由だけで行っていることの 1 つです。「違うと思う」

于 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 に答える