Linux上的OpenGL:dlopen libGL.so

peo*_*oro 10 c linux opengl dynamic-linking dynamic-loading

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

他们为什么这样做呢?

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

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

Fle*_*exo 9

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

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


Mat*_*gro 8

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

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

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

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