2015-12-21 1 views
0

Je reçois une erreur de compilation laisse perplexe tout en essayant d'utiliser SDL2/GLEW/OpenGL MSYS2:Glew avertissements APIENTRY et éventuellement des erreurs liées à 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" 

Je ne suis pas sûr si cela est prévu ou non. Il y a une définition au-dessus de celle qui déclenche l'avertissement, enveloppée dans un #else d'un #ifdef APIENTRY. L'avertissement est déclenchée par:

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

Cela semble lié à de nombreuses autres questions, mais dont la plupart discuter de l'ordre de comprend - cet ordre apparaît comme cela devrait fonctionner à partir d'eux:

Normalement, je ne serais pas trop pris la peine par cela, mais je suis aussi obtenir des erreurs empêchant ma construction en raison de problèmes avec ce qui semble être APIENTRY dans les en-têtes inclus SDL. Par exemple:

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); 
          ^

Cela semble une coïncidence inhabituelle, comme je l'ai rarement eu des problèmes de ce genre, pour avoir l'avertissement et l'erreur ensemble.

Pourquoi glew.h aurait-il un second jeu de #defines qui remplace tout #defines précédent, quand il va à des fins qui empêchent de les casser (pour une bonne raison)? Cela semble destiné à causer des erreurs sur la route. Est-ce que mon paquet de glew est simplement cassé?

+0

Il est étrange que vous utilisiez des en-têtes de/usr/include (la chaîne d'outils basée sur msys-2.0.dll) et aussi en utilisant les en-têtes de/mingw64/include (la chaîne d'outils mingw-w64). Ces chaînes d'outils ne sont pas supposées être mélangées et assorties; vous devriez en choisir un et s'en tenir à cela. Je recommande d'utiliser mingw-w64 si vous le pouvez car il compile les binaires Windows natifs qui n'ont pas besoin de l'émulation POSIX fournie par msys-2.0.dll. –

Répondre

0

Il semble que cela soit dû au fait que cette version/construction de g ++ ne définit pas _WIN32, ce qui fait que glew traverse la branche Unix des directives du préprocesseur, rompant la définition APIENTRY. En tant que tel, ce n'est en fait pas un problème avec GLEW du tout.

Apparemment, this is intended behavior on the part of MSYS2's g++, bien que je sois sceptique quant à la sagesse de celui-ci. La bonne solution consiste à ajouter -mwin32 à vos indicateurs de compilation. Ceci déclarera _WIN32 comme d'habitude et évitera que les librairies de type Unix ne deviennent confuses au sujet de leur plate-forme.