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
这似乎与许多其他问题有关,但其中大部分讨论了包含的顺序 - 这个顺序看起来应该基于它们工作:
- How to prevent macro redefinition
- OpenGL libraries linkage on linux
- 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 问题,我也遇到了阻止构建的错误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 风格的库对其平台感到困惑。
我在尝试使用 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
这似乎与许多其他问题有关,但其中大部分讨论了包含的顺序 - 这个顺序看起来应该基于它们工作:
- How to prevent macro redefinition
- OpenGL libraries linkage on linux
- 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 问题,我也遇到了阻止构建的错误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 风格的库对其平台感到困惑。