适用于OS X和Linux的OpenGL标头

Dre*_*rew 11 c++ opengl header

我想在我的opengl程序(C++)中同时拥有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>
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*hen 30

这是我使用的:

#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
Run Code Online (Sandbox Code Playgroud)

Mac的所有编译器(好吧,我猜这是gcc,也许是clang)应该定义__APPLE__.我抛弃它 _WIN32,因为windows.h平台上的gl.h必须包含在windows.h中.

如果您有许多需要OpenGL的文件,可以将它放在自己的包含文件(例如gl_includes.h)中

-matt

  • 我更喜欢`#if defined`形式而不是`#ifdef`因为你可以使用`#elif defined`并且有一个`#endif`而不是`#else`,`#ifdef`有多个`#endif` (2认同)

Ski*_*izz 12

或者,将特定于平台的标头放入自己的文件中:

Linux的\ platform.h

#include <GL/gl.h>
#include <GL/glu.h>
Run Code Online (Sandbox Code Playgroud)

OSX\platform.h

#include <OpenGL/gl.h> //OS x libs
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
Run Code Online (Sandbox Code Playgroud)

的win32\platform.h

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
Run Code Online (Sandbox Code Playgroud)

并包含在代码中:

#include "platform.h"
Run Code Online (Sandbox Code Playgroud)

然后让您的构建系统根据目标平台指定正确的搜索路径.

  • @Steve M ifdefs并不可怕.对于试图移植的代码库,这是您可以使用的最好的事情,以确保您不必担心项目配置.库将在编译时自动配置.ifdefs是试图可移植的代码库的天赐之物. (6认同)

gre*_*ade 5

#ifdef __APPLE__
#include <OpenGL/gl.h> //OS x libs
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
Run Code Online (Sandbox Code Playgroud)