Linux上的OpenGL:dlopen libGL.so

使用Linux上的OpenGL的大多数应用程序(和库)在运行时使用dlopen API加载libGL.so ,而不是dynamic链接它。

他们为什么这样做呢?

我能想象的唯一原因是,这是因为任何graphics驱动程序供应商提供了不同的libGL ,两个不同的libGL可能是ABI不兼容的。 (嗯,为什么他们应该是ABI不兼容?即使他们是,为什么通过dlopen加载他们可以解决这个问题?)

无论如何,假设有一个很好的理由这样做,我也想这样做。 有人有链接到一个开源的C / C ++代码,通过dlopen加载所有的OpenGL函数,我可以包括到我的项目,而不需要太多的调整?

人们做这件事主要有两个原因:

  1. 对于没有OpenGL的系统,您可以给出明智的错误
  2. 供应商提供了许多不同的扩展,唯一的支持多套扩展​​的解决方案是使用dlsym来检查它们。 GLEW提供了一个不错的方式为你做这个。

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

因此,动态获取入口点允许您在运行时选择apropiate呈现路径。

另外,在GL功能> 1.1的Windows上也需要它。

GLEW为你做这个,它不会dlopen libGL,它使用glXGetProcAddress / wglGetProcAddress / aglGetProcAddress从驱动程序获取GL函数指针,它是跨平台的。