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