我想在我的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>
}
这是我使用的代码:
#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
所有Mac的编译器(我猜就是gcc和maybe clang)都应该定义__APPLE__
。我把_WIN32
加进去是因为在Windows平台上,必须在包含gl.h之前包含windows.h。
如果你有很多需要OpenGL的文件,可以把它放到自己的包含文件中(比如说gl_includes.h)。
-matt
或者,将特定于平台的头文件放入它们自己的文件中:
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>
并且在代码中包含:
#include "platform.h"
然后让您的构建系统根据目标平台指定正确的搜索路径。
#ifdef __APPLE__
#include <OpenGL/gl.h> //OS x libs
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#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
#if defined
形式而不是#ifdef
,因为你可以使用#elif defined
并且只需要一个单独的#endif
,而不是使用多个#endif
的#else
,#ifdef
。 - Skizz