OpenGL头文件适用于OS X和Linux

11

我想在我的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>
}
4个回答

32

这是我使用的代码:

#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


2
我更喜欢使用#if defined形式而不是#ifdef,因为你可以使用#elif defined并且只需要一个单独的#endif,而不是使用多个#endif#else#ifdef - Skizz
总的来说,这听起来像是一个更好的想法。当然,在这里,#ifdef _WIN32 实际上被折叠到第一个 #ifdef 的非苹果分支中,所以我不确定它是否会减少 #endifs。但如果我为 mac/win/*nix 分别创建 3 个分支,并像您建议的那样使用 #if defined,可能会更清晰。 - Gretchen
Jerry- 哎呀 - 我把这个从我的非glut项目中复制过来了。需要编辑一下。 - Gretchen
我以为你只需要包含GLUT,其他两个库会通过GLUT自动包含进来? - Gerard

11

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

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"

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


6
@ifdefs并不可怕。对于试图实现可移植性的代码库来说,它是最好的工具之一,可以确保您不需要担心项目配置。库将在编译时自动配置。如果尝试实现可移植性的代码库,则#ifdef是救星。 - leetNightshade

5
#ifdef __APPLE__
#include <OpenGL/gl.h> //OS x libs
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

2
我们在OSX、Unix、Linux、Android和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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接