使用Linux上的OpenGL的大多数应用程序(和库)在运行时使用dlopen
API加载libGL.so
,而不是dynamic链接它。
他们为什么这样做呢?
我能想象的唯一原因是,这是因为任何graphics驱动程序供应商提供了不同的libGL
,两个不同的libGL
可能是ABI不兼容的。 (嗯,为什么他们应该是ABI不兼容?即使他们是,为什么通过dlopen
加载他们可以解决这个问题?)
无论如何,假设有一个很好的理由这样做,我也想这样做。 有人有链接到一个开源的C / C ++代码,通过dlopen
加载所有的OpenGL函数,我可以包括到我的项目,而不需要太多的调整?
人们做这件事主要有两个原因:
这样做,所以你不必静态链接到一个GL实现,例如,如果你的代码使用glBindFragDataLocation,这是在OpenGL 3.0和更新版本上可用,它将无法运行在OpenGL 2.1和更早的神秘的链接器错误实现。
因此,动态获取入口点允许您在运行时选择apropiate呈现路径。
另外,在GL功能> 1.1的Windows上也需要它。
GLEW为你做这个,它不会dlopen libGL,它使用glXGetProcAddress / wglGetProcAddress / aglGetProcAddress从驱动程序获取GL函数指针,它是跨平台的。