2010-10-11 14 views
11

Chciałbym mieć zarówno załączniki dla OS X, jak i dla Linuxa w moim programie OpenGL (C++), w jaki sposób mogę ustawić mój program tak, aby używał go, jeśli drugi nie jest dostępny? Oto co mam aktualnie robi:Nagłówki OpenGL dla OS X i 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> 
} 

Odpowiedz

30

Oto co mogę użyć:

#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 

Wszystkie kompilatory dla Mac (dobrze, myślę, że to gcc, a może dzyń) należy zdefiniować __APPLE__. Wrzucam tam _WIN32, ponieważ wydaje się, że Windows.h musi być włączony przed gl.h na platformach Windows.

Można umieścić to na własną rękę to plik (powiedzmy gl_includes.h) Jeśli masz wiele plików, które muszą OpenGL

-Matt

+2

Wolę '#if defined' formie zamiast' # ifdef' beacuse można wtedy użyć '#elif defined' i mieć pojedyncze '# endif' zamiast' # else', '# ifdef' z wieloma' # endif'' – Skizz

+0

+1 dla * nie * włącznie z 'glut.h' gdziekolwiek indziej! –

+0

Ogólnie rzecz biorąc, brzmi to jak lepszy pomysł. Oczywiście tutaj #ifdef _WIN32 jest faktycznie złożony w gałąź innego niż jabłko pierwszego #ifdef, więc nie jestem pewien, czy zredukuje #endifs. Ale może być jaśniej, gdy utworzę 3 oddzielne gałęzie dla mac/win/* nix i użyję zdefiniowanego #if, jak sugerujesz. – 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

Alternatywnie, umieścić na platformie konkretnych nagłówków do własnych plików:

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> 

i to w kodzie:

#include "platform.h" 

a następnie pozwól, aby system budowania podać prawidłową ścieżkę przeszukiwania oparty na platformie docelowej.

+0

+1, ifdefs są okropne. –

+6

@Steve M ifdefs nie są straszne. Aby baza kodowa próbowała być przenośna, jest to najlepsza rzecz, której możesz użyć, aby upewnić się, że nie musisz się martwić konfiguracją projektu. Biblioteka zostanie automatycznie skonfigurowana podczas kompilacji. ifdefs to darem niebios dla baz kodów próbujących być przenośnymi. – leetNightshade

0

Co używamy dla OSX, Linux, Unix, Androida i 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