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 警告和可能相关的错误的主要内容,如果未能解决你的问题,请参考以下文章

MSYS2 上的 CMake 冻结

如何更改 MSYS2 上的 HOME 目录和启动目录?

使用 DLL 时 Qt 应用程序崩溃,如果导出的函数未声明 APIENTRY,则可以正常工作

OSX Yosemite 10.10.3 上的 Cmake - GLEW:找不到包“gl”

如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰

从 Makefile 调用时,MSYS2 shell 上的 ar 会收到截断的路径?