MSYS2 の SDL2 / GLEW / OpenGL を使用しようとすると、複雑なコンパイラ エラーが発生します。
In file included from /m/gstest/inc/graphics/GraphicsSystem.h:36:0,
from /m/gstest/src/main.cpp:1:
/c/msys64/mingw64/include/GL/glew.h:233:0: warning: "APIENTRY" redefined
#define APIENTRY
^
In file included from /usr/include/w32api/windef.h:8:0,
from /m/gstest/inc/graphics/GraphicsSystem.h:33,
from /m/gstest/src/main.cpp:1:
/usr/include/w32api/minwindef.h:103:0: note: this is the location of the previous definition
#define APIENTRY WINAPI
^
GraphicsSystem.h:
// Must come before glew
#include <windef.h>
// Must come before OpenGL (SDL)
#include "glew.h"
//#include "glxew.h"
//#include "wglew.h"
#include "SDL.h"
#include "SDL_opengl.h"
#include "SDL_syswm.h"
これがおそらく意図されているかどうかはわかりません。警告をトリガーする定義の上に、 の でラップされた定義があり#else
ます#ifdef APIENTRY
。警告は次の場合にトリガーされます。
#define GLEW_APIENTRY_DEFINED
#define APIENTRY // <-- Line 233 glew.h
これは他の多くの質問に関連しているようですが、そのほとんどはインクルードの順序について議論しています - この順序はそれらに基づいて機能するはずです:
- マクロの再定義を防ぐ方法
- Linux での OpenGL ライブラリのリンケージ
- http://forums.codeguru.com/showthread.php?438957-Why-do-i-get-this-warning
- https://www.opengl.org/discussion_boards/showthread.php/163436-GLUT-and-macro-redefinition-errors
通常はこれに悩まされることはありませんが、 SDL のインクルード ヘッダーの APIENTRY と思われる問題が原因で、ビルドを妨げるエラーが発生します。例えば:
In file included from /usr/include/w32api/winbase.h:15:0,
from /usr/include/w32api/windows.h:70,
from /c/msys64/mingw64/include/SDL2/SDL_opengl.h:40,
from /m/gstest/inc/graphics/GraphicsSystem.h:41,
from /m/gstest/src/main.cpp:1:
/usr/include/w32api/debugapi.h:27:31: error: expected initializer before 'Contin
ueDebugEvent'
WINBASEAPI WINBOOL APIENTRY ContinueDebugEvent (DWORD dwProcessId, DWORD dwThreadId, DWORD dwContinueStatus);
^
この種の問題が発生したことはめったになく、警告とエラーが一緒に発生するだけなので、これは異常な偶然のようです。
glew.h が(正当な理由で) それらを壊すのを防ぐような目的に行くとき、なぜ glew.h は#defines
以前の を上書きする 2 番目のセットを持つのでしょうか? #defines
それは将来的にエラーを引き起こす運命にあるようです。グリューのパッケージが壊れているだけですか?