2010-10-11 20 views
11

Me gustaría tener ambos, tanto para OS X como para Linux en mi programa OpenGL (C++), ¿cómo puedo configurar mi programa para usar uno si el otro no está disponible? Esto es lo que estoy haciendo actualmente:Encabezados OpenGL para OS X y 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> 
} 

Respuesta

30

aquí es lo que yo uso:

#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 

Todos los compiladores para el mac (bueno, supongo que es gcc, y tal vez sonido metálico) debe definir __APPLE__. Lanzo el _WIN32 allí porque Windows.h debe estar incluido antes de gl.h en plataformas de Windows, parece.

Usted puede poner esto en su propio archivo de inclusión (por ejemplo gl_includes.h) si tiene muchos archivos que necesitan OpenGL

-Matt

+2

Yo prefiero el '#if defined' formulario en lugar de' # ifdef' por culpa A continuación, puede usar '#elif defined' y tener un solo '# endif' en lugar de' # else', '# ifdef' con múltiples' # endif' – Skizz

+0

+1 para * no * incluyendo 'glut.h' en cualquier lugar allí tampoco! –

+0

En general, parece una mejor idea. Por supuesto aquí, el #ifdef _WIN32 está realmente doblado en la rama no de apple del primer #ifdef, así que no estoy seguro de que reduzca los #endifs. Pero podría ser más claro si hice 3 ramas separadas para mac/win/* nix, y usé # si está definido, como sugiere. – 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

También puede poner la plataforma cabeceras específicas en sus propios archivos:

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> 

e incluyen en el código:

#include "platform.h" 

y luego deje que su sistema de construcción especifica la ruta de búsqueda correcto basado en la plataforma de destino.

+0

+1, ifdefs son terribles. –

+6

@Steve M ifdefs no son terribles. Para una base de código que intente ser portátil, es lo mejor que puede usar para asegurarse de no tener que preocuparse por las configuraciones del proyecto. La biblioteca se configurará automáticamente en el momento de la compilación. ifdefs son un regalo del cielo para las bases de código que intentan ser portátiles. – leetNightshade

0

lo que usamos para OSX, Unix, Linux, Android y 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 
Cuestiones relacionadas