11

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

他们为什么这样做呢?

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

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

4

2 回答 2

9

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

  1. 对于没有 OpenGL 的系统,您可以给出一个合理的错误
  2. 供应商提供了许多不同的扩展,并且在每个供应商没有不同二进制文件的情况下支持多组扩展的唯一明智的方法是使用 dlsym 来检查它们。不过, GLEW为您提供了一种很好的方法。
于 2010-11-15T16:11:24.433 回答
8

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

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

此外,对于 GL 功能 > 1.1,它在 Windows 上是必需的。

GLEW 会为您执行此操作,它不会 dlopen libGL,它使用 glXGetProcAddress/wglGetProcAddress/aglGetProcAddress 从驱动程序获取 GL 函数指针,并且它是跨平台的。

于 2010-11-15T20:33:17.020 回答