【问题标题】:OpenGL headers for OS X & Linux适用于 OSX 和 Linux 的 OpenGL 头文件
【发布时间】:2017-08-29 01:21:24
【问题描述】:

我想在我的 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>
}

【问题讨论】:

    标签: c++ opengl header


    【解决方案1】:

    这是我使用的:

    #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,也许是 clang)都应该定义 __APPLE__。我把 _WIN32 扔在那里,因为 windows.h 必须在 windows 平台上的 gl.h 之前包含,看来。

    如果你有很多需要 OpenGL 的文件,你可以把它放在它自己的包含文件中(比如 gl_includes.h)

    -马特

    【讨论】:

    • 我更喜欢 #if defined 形式而不是 #ifdef 因为你可以使用 #elif defined 并有一个 #endif 而不是 #else,#ifdef 和多个 #endif
    • 总的来说,这听起来确实是一个更好的主意。当然在这里,#ifdef _WIN32 实际上被折叠到第一个#ifdef 的非苹果分支中,所以我不确定它会减少#endifs。但是,如果我为 mac/win/*nix 创建了 3 个单独的分支,并按照您的建议使用 #if defined,可能会更清楚。
    • Jerry- 哎呀 - 我从我自己的非过剩项目中复制了这个。编辑时间。
    • 我以为您只需要包含 GLUT,其他两个将通过 GLUT 包含?
    【解决方案2】:

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

    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"
    

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

    【讨论】:

    • @Steve M ifdefs 并不可怕。对于尝试可移植的代码库,这是您可以用来确保您无需担心项目配置的最佳方式。该库将在编译时自动配置。 ifdefs 是试图移植的代码库的天赐之物。
    【解决方案3】:
    #ifdef __APPLE__
    #include <OpenGL/gl.h> //OS x libs
    #include <OpenGL/glu.h>
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    

    【讨论】:

      【解决方案4】:

      我们在 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
      

      【讨论】:

        猜你喜欢
        • 2014-06-03
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多