代码之家  ›  专栏  ›  技术社区  ›  peoro

Linux上的OpenGL:dlopen libGL.so

  •  9
  • peoro  · 技术社区  · 14 年前

    大多数应用程序(和库)在Linux负载下使用OpenGL libGL.so 在运行时使用 dlopen 而不是动态链接。

    他们为什么这么做?

    我能想象的唯一原因是,这是因为任何图形驱动程序供应商都提供了不同的 libGL ,和两个不同的 伦敦银行同业拆借利率 可能是ABI不兼容。(嗯,嗯,为什么他们会不相容呢?即使是,为什么要通过 dlopen公司 会解决这个问题吗?)

    不管怎样,如果有充分的理由这样做,我也愿意这样做。任何人都有一个链接到一个开源的C/C++代码,该代码通过所有的OpenGL函数加载 dlopen公司 ,我可以在不需要太多调整的情况下将其包含到我的项目中?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Flexo - Save the data dump sunny moon    14 年前

    人们这样做的主要原因有两个:

    1. 对于没有OpenGL的系统,您可以给出一个合理的错误
    2. 供应商提供了许多不同的扩展,而支持多组扩展的唯一合理方法是使用dlsym来检查它们,而每个供应商没有不同的二进制文件。 GLEW 为你提供了一个很好的方法。
        2
  •  8
  •   Dr. Snoopy    14 年前

    这样做是为了使您不必静态链接到一个GL实现,例如,如果您的代码使用glBindFragDataLocation(在OpenGL 3.0和更新版本上可用),它将无法在OpenGL 2.1和更早的实现上运行,并出现一个神秘的链接器错误。

    因此,动态获取入口点允许您在运行时选择适当的渲染路径。

    此外,对于总帐功能>1.1,在Windows上也是必需的。

    GLEW是为你做的,它没有dlopen libGL,它使用glxgetprocadaddress/wglgetprocadaddress/aglgetprocadaddress从驱动程序中获取GL函数指针,而且它是跨平台的。