Я получаю сбивающую с толку ошибку компилятора при попытке использовать SDL2 / GLEW / OpenGL MSYS2:
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
Кажется, это связано со многими другими вопросами, но большинство из них обсуждают порядок включений — этот порядок выглядит так, как будто он должен работать на их основе:
Обычно я не был бы тоже это беспокоит, но я также получаю ошибки, препятствующие моей сборке, из-за проблем с тем, что кажется APIENTRY во включенных заголовках SDL. Например:
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
когда это идет к таким целям, чтобы предотвратить их нарушение (по уважительной причине)? Это, кажется, суждено вызвать ошибки в будущем. Мой пакет глю просто сломан?
Кажется, это связано с тем, что эта версия / сборка g ++ не определяет _WIN32
, что заставляет glew проходить по Unix-ветви директив препроцессора, нарушая определение APIENTRY. Таким образом, это на самом деле не проблема с GLEW вообще.
По-видимому, это намеренное поведение со стороны MSYS2 g ++, хотя я скептически отношусь к мудрости этого. Правильное решение состоит в том, чтобы добавить -mwin32
на флаги вашего компилятора. Это объявит _WIN32
как обычно и избегайте путаницы библиотек в стиле Unix по поводу своей платформы.
Других решений пока нет …