MSYS2 上的 GLEW APIENTRY 警告和可能相关的错误
Posted
技术标签:
【中文标题】MSYS2 上的 GLEW APIENTRY 警告和可能相关的错误【英文标题】:GLEW APIENTRY warnings and possibly related errors on MSYS2 【发布时间】:2015-12-21 01:35:49 【问题描述】:我在尝试使用 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
这似乎与许多其他问题有关,但其中大部分讨论了包含的顺序 - 这个顺序似乎应该基于它们起作用:
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 的问题,我也遇到了阻止我构建的错误。例如:
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 包是不是坏了?
【问题讨论】:
奇怪的是,您正在使用来自 /usr/include 的头文件(基于 msys-2.0.dll 的工具链)并且还使用来自 /mingw64/include 的头文件(mingw-w64 工具链)。这些工具链不应该混合搭配;你应该选择一个并坚持下去。如果可以,我建议使用 mingw-w64,因为它编译不需要 msys-2.0.dll 提供的 POSIX 仿真的本机 Windows 二进制文件。 【参考方案1】:这似乎是由于 g++ 的这个版本/构建没有定义 _WIN32
,这导致 glew 遍历预处理器指令的 Unix 分支,破坏了 APIENTRY 定义。因此,这实际上根本不是 GLEW 的问题。
显然,this is intended behavior on the part of MSYS2's g++,尽管我对它的智慧持怀疑态度。正确的解决方案是将-mwin32
添加到您的编译器标志中。这会将_WIN32
声明为正常,并避免 Unix 风格的库对其平台感到困惑。
【讨论】:
以上是关于MSYS2 上的 GLEW APIENTRY 警告和可能相关的错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 DLL 时 Qt 应用程序崩溃,如果导出的函数未声明 APIENTRY,则可以正常工作
OSX Yosemite 10.10.3 上的 Cmake - GLEW:找不到包“gl”