Linux上的OpenGL:dlopen libGL.so

时间:2010-11-15 16:09:22

标签: c linux opengl dynamic-linking dynamic-loading

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

为什么他们这样做?

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

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

2 个答案:

答案 0 :(得分:8)

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

  1. 您可以为没有OpenGL的系统提供合理的错误
  2. 供应商提供了许多不同的扩展,并且唯一能够支持多组扩展但没有每个供应商的不同二进制文件的理智方法是使用dlsym来检查它们。 GLEW为你提供了一个很好的方法。

答案 1 :(得分:8)

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

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

此外,在Windows上需要GL功能> 1.1。

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