0

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

これは他の多くの質問に関連しているようですが、そのほとんどはインクルードの順序について議論しています - この順序はそれらに基づいて機能するはずです:

通常はこれに悩まされることはありませんが 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それは将来的にエラーを引き起こす運命にあるようです。グリューのパッケージが壊れているだけですか?

4

1 に答える 1

0

これは、 g++ のこのバージョン/ビルドが を定義_WIN32していないことが原因のようです。これにより、glew がプリプロセッサ ディレクティブの Unix ブランチをトラバースし、APIENTRY 定義が壊れています。そのため、これは実際には GLEW ではまったく問題ではありません。

どうやら、これは MSYS2 の g++ 側で意図された動作ですが、その賢明さについては懐疑的です。-mwin32適切な解決策は、コンパイラ フラグに追加することです。これにより、通常どおりに宣言_WIN32され、Unix スタイルのライブラリがプラットフォームについて混乱するのを回避できます。

于 2015-12-21T01:57:12.263 に答える