11

I'd like to have both the includes for OS X as well as linux in my opengl program (C++) how can I set my program to use one if the other is not available? Here's what i'm currently doing:

 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>
}
Drew
  • 2,583
  • 5
  • 36
  • 54

4 Answers4

32

Here is what I use:

#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

All compilers for the mac (well,I guess that's gcc, and maybe clang) should define __APPLE__. I throw the _WIN32 in there since windows.h must be included before gl.h on windows platforms, it seems.

You can put this in its own include file (say gl_includes.h) if you have many files that need OpenGL

-matt

Gretchen
  • 2,274
  • 17
  • 16
  • 2
    I prefer the `#if defined` form instead of `#ifdef` beacuse you can then use `#elif defined` and have a single `#endif` rather than `#else`,`#ifdef` with multiple `#endif` – Skizz Oct 11 '10 at 16:03
  • In general, that does sound like a better idea. Of course here, the #ifdef _WIN32 is actually folded into the non-apple branch of the first #ifdef, so I'm not sure it would reduce the #endifs. But it might be clearer if I made 3 separate branches for mac/win/*nix, and used #if defined, as you suggest. – Gretchen Oct 11 '10 at 16:09
  • Jerry- oops - I copied this from my own, non-glut project. Edit time. – Gretchen Oct 11 '10 at 16:12
  • I thought you only had to include GLUT and the other two would be included through GLUT? – Gerard May 06 '14 at 12:08
11

Alternatively, put the platform specific headers into their own files:

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>

and include in code:

#include "platform.h"

and then let your build system specify the correct search path based on the target platform.

Skizz
  • 69,698
  • 10
  • 71
  • 108
  • 6
    @Steve M ifdefs are not terrible. For a codebase trying to be portable, that is the best thing you can use to ensure you don't need to worry about project configurations. The library will automatically be configured upon compile time. ifdefs are a godsend for codebases trying to be portable. – leetNightshade Apr 12 '14 at 07:52
5
#ifdef __APPLE__
#include <OpenGL/gl.h> //OS x libs
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
greyfade
  • 24,948
  • 7
  • 64
  • 80
2

What we use for OSX, Unix, Linux, Android, and 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
Joel Teply
  • 3,260
  • 1
  • 31
  • 21