2010-10-11 10 views
11

Opengl programımda (C++) hem OS X'in hem de linux'un içeriklerini bulundurmak isterim. Programım, diğeri yoksa bir tane kullanmak üzere nasıl ayarlayabilirim? İşte ben şu anda ne yapıyorum:OS X & Linux için OpenGL üstbilgileri

#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 

Tüm derleyiciler mac için tanımlamalıdır (pekala, bunu gcc ve belki çınlama olduğunu tahmin):

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> 
} 
İşte

cevap

30

kullandığım budur __APPLE__. Windows platformlarında gl.h'den önce windows.h'nin dahil edilmesi gerektiğinden oraya _WIN32'u atıyorum. Bunu kendi içinde bu koyabilirsiniz

Eğer

-Matt

+2

ben 'yerine # ifdef'' arasında defined' formu #if sonra defined' #elif 'kullanabilirsiniz beacuse tercih ve "# else" yerine # bir 'endif' yerine birden fazla' # endif' için – Skizz

+0

+1 yerine * bir * 'endif' yerine * burada * her yerde' glut.h' dahil! –

+0

Genel olarak, bu daha iyi bir fikir gibi geliyor. Tabii ki, #ifdef _WIN32 aslında ilk #ifdef'in elma olmayan dalına katlanıyor, bu yüzden #endifleri azaltacağından emin değilim. Ancak, mac/win/* nix için 3 ayrı dal yaptım ve önerdiğiniz gibi #if tanımlanmışsa daha net olabilir. – 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

Alternatif OpenGL ihtiyaç sayıda dosya varsa dosya (gl_includes.h diyelim) dahil kendi dosyalarına özgü başlıklarını platformu koyun:

linux \ platform.h

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

osx \ platform.h

#include "platform.h" 

ve sonra yapı sistemi hedef platform dayalı doğru arama yolu belirtin bakalım:

#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> 
ve kod içerir.

+0

+1, ifdefs korkunç. –

+6

@Steve M ifdefs korkunç değil. Taşınabilir olmaya çalışan bir kod tabanı için, proje yapılandırmaları hakkında endişelenmenize gerek kalmadığından emin olmak için kullanabileceğiniz en iyi şey budur. Kütüphane derleme zamanı otomatik olarak yapılandırılacaktır. ifdefs, taşınabilir olmaya çalışan kod tabanları için bir nimettir. – leetNightshade

0

biz OSX, Unix, Linux, Android ve iOS

için kullanmak ne
#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