在Linux上使用OpenGL:dlopen libGL.so

11
大多数在Linux上使用OpenGL的应用程序和库都是在运行时使用dlopen API加载libGL.so,而不是动态链接它。
为什么他们要这样做呢?
我唯一能想到的原因是因为任何图形驱动程序供应商都会提供不同的libGL,并且两个不同的libGL可能是ABI不兼容的。(好吧,为什么它们应该是ABI不兼容的?即使它们不兼容,为什么通过dlopen加载它们会修复这个问题?)
无论如何,假设有一个很好的理由这样做,我也想那样做。是否有任何链接到所有OpenGL函数的开源C/C++代码,可以通过dlopen加载,我可以将其包含到我的项目中,而不需要太多调整?

3
大多数在Linux上使用OpenGL的应用程序(和库)都是在运行时使用dlopen加载libGL.so的,但这种说法并不完全准确,尤其是对于开源的仅支持GL的游戏。 - user502515
2个回答

9

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

  1. 您可以为没有OpenGL的系统提供合理的错误提示
  2. 厂商提供许多不同的扩展,而支持多组扩展的唯一明智方法(而无需为每个厂商提供不同的二进制文件)是使用dlsym进行检查。 GLEW 为您提供了一个很好的方法。

那么为什么他们不在其他平台上做同样的事情呢? - peoro
在Windows上,例如WGL提供了一种获取扩展函数指针的机制,这必须用于所有扩展:http://www.opengl.org/wiki/Platform_specifics:_Windows#wglGetProcAddress,基本上与调用dlsym相同,只是没有调用dlopen。 - Flexo

8

这样做是为了避免静态链接到GL实现,例如,如果您的代码使用了OpenGL 3.0及更高版本可用的glBindFragDataLocation函数,则在OpenGL 2.1及更早版本的实现中运行时会出现加密的链接器错误。

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

此外,在Windows上,GL函数>1.1是必需的。

GLEW可以为您完成这项工作,它不会dlopen libGL,而是使用glXGetProcAddress/wglGetProcAddress/aglGetProcAddress从驱动程序获取GL函数指针,并且它是跨平台的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接