2010-10-11 4 views
11

Je voudrais avoir les deux inclus pour OS X ainsi que linux dans mon programme opengl (C++) comment puis-je configurer mon programme pour en utiliser un si l'autre n'est pas disponible? Voici ce que je suis en train de faire:En-têtes OpenGL pour OS X & Linux

if(!FileExists(OpenGL/gl.h)) 
    #include <GL/glut.h> //linux lib 
else { 
    #include <OpenGL/gl.h> //OS x libs 
    #include <OpenGL/glu.h> 
    #include <GLUT/glut.h> 
} 

Répondre

30

Voici ce que j'utilise:

#ifdef __APPLE__ 
#include <OpenGL/gl.h> 
#include <OpenGL/glu.h> 
#include <GLUT/glut.h> 
#else 
#ifdef _WIN32 
    #include <windows.h> 
#endif 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 
#endif 

Tous les compilateurs pour Mac (bien, je suppose que ce gcc, et peut-être clang) devraient définir __APPLE__. Je jette le _WIN32 dedans puisque windows.h doit être inclus avant gl.h sur les plates-formes de fenêtres, il semble.

Vous pouvez mettre ceci dans son propre fichier include (par exemple gl_includes.h) si vous avez beaucoup de fichiers qui ont besoin d'OpenGL

-Matt

+2

Je préfère la forme '#if defined' au lieu de' # ifdef' beacuse vous pouvez ensuite utiliser '#elif defined' et avoir un seul '# endif' plutôt que' # else', '# ifdef' avec plusieurs' # endif' – Skizz

+0

+1 pour * not * incluant 'glut.h' n'importe où! –

+0

En général, cela semble être une meilleure idée. Bien sûr, ici, #ifdef _WIN32 est en fait replié dans la branche non-pomme du premier #ifdef, donc je ne suis pas sûr que cela réduirait les #endifs. Mais il pourrait être plus clair si j'ai créé 3 branches séparées pour mac/win/* nix, et utilisé #if défini, comme vous le suggérez. – Gretchen

5
#ifdef __APPLE__ 
#include <OpenGL/gl.h> //OS x libs 
#include <OpenGL/glu.h> 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
12

Vous pouvez également mettre la plate-forme en-têtes spécifiques dans leurs propres fichiers:

linux \ platform.h

#include <GL/gl.h> 
#include <GL/glu.h> 

osx \ platform.h

#include <OpenGL/gl.h> //OS x libs 
#include <OpenGL/glu.h> 
#include <GLUT/glut.h> 

win32 \ platform.h

#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 

et inclure dans le code:

#include "platform.h" 

puis laissez votre système de construction spécifier le chemin de recherche correct basé sur la plate-forme cible.

+0

+1, ifdefs sont terribles. –

+6

@Steve M ifdefs ne sont pas terribles. Pour une base de code essayant d'être portable, c'est la meilleure chose que vous pouvez utiliser pour vous assurer que vous n'avez pas à vous soucier des configurations de projet. La bibliothèque sera automatiquement configurée lors de la compilation. ifdefs est une aubaine pour les bases de code qui essayent d'être portables. – leetNightshade

0

Ce que nous utilisons pour OSX, Unix, Linux, Android et iOS

#if defined(_WIN32) || defined(_WIN64) 
# include <gl/glew.h> 
# include <GL/gl.h> 
# include <GL/glu.h> 
#elif __APPLE__ 
# include "TargetConditionals.h" 
# if (TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR) || TARGET_OS_IPHONE 
# include <OpenGLES/ES2/gl.h> 
# include <OpenGLES/ES2/glext.h> 
# else 
# include <OpenGL/gl.h> 
# include <OpenGL/glu.h> 
# include <OpenGL/glext.h> 
# endif 
#elif defined(__ANDROID__) || defined(ANDROID) 
# include <GLES2/gl2.h> 
# include <GLES2/gl2ext.h> 
#elif defined(__linux__) || defined(__unix__) || defined(__posix__) 
# include <GL/gl.h> 
# include <GL/glu.h> 
# include <GL/glext.h> 
#else 
# error platform not supported. 
#endif