MSYS2 上的 GLEW APIENTRY 警告和可能相关的错误

GLEW APIENTRY warnings and possibly related errors on MSYS2

我在尝试使用 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"

我不确定这是否有意为之。在触发警告的上面有一个定义,包裹在 #ifdef APIENTRY#else 中。警告由以下因素触发:

#define GLEW_APIENTRY_DEFINED
#define APIENTRY // <-- Line 233 glew.h

这似乎与许多其他问题有关,但其中大部分讨论了包含的顺序 - 这个顺序看起来应该基于它们工作:

通常我不会为此烦恼,但由于 SDL 中似乎包含的 APIENTRY 问题,我也遇到了阻止构建的错误headers.例如:

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 会有第二组 #defines 来覆盖之前的任何 #defines,当它达到防止破坏它们的目的时(有充分的理由)?这似乎注定会导致错误。我的glew包是不是坏了?

这似乎是由于 g++ 的 version/build 未定义 _WIN32,这导致 glew 遍历预处理器指令的 Unix 分支,破坏了 APIENTRY 定义。因此,这实际上根本不是 GLEW 的问题。

显然,this is intended behavior on the part of MSYS2's g++,尽管我怀疑它是否明智。正确的解决方案是将 -mwin32 添加到编译器标志中。这将声明 _WIN32 正常并避免 Unix 风格的库对其平台感到困惑。