为什么OpenGL的设计必须在运行时手动加载实际函数?

时间:2016-01-07 18:05:35

标签: opengl

我刚刚阅读了Loading OpenGL Functions,并想知道为什么OpenGL的设计方式,而不是简单方法,提供动态库和相应的标题?

1 个答案:

答案 0 :(得分:6)

  

提供动态库和相应的标题?

然后你误解了一个动态库"的工作原理。

让我们以Windows为例。在Windows上,如果您拥有的是动态库和相应的标题",您仍然无法加载该DLL并使用它。即使在标头中使用__declspec(dllimport)声明也不足。您还需要一件事:导入库。这是一个.lib,可以在加载DLL时有效地为您加载函数指针。

简而言之,它的语法糖:很高兴,但不是必需的。很像OpenGL加载库。

在Linux上,情况有所不同。 SO文件更自包含;它们基本上存储了相应的导入库。那么,你可以在理论上使用"一个动态库和相应的标题"。

即便如此,它还是糖;你可以动态加载它们并手动获取函数指针。

理论上,所有这些糖都可以与OpenGL一起使用。但是,让我们考虑一下这种情况的后果。

在Windows上,导入库静态链接到您的应用程序。因此,必须工作;如果它找不到DLL,或者DLL没有提供它应该的功能,那么你的程序就无法运行。完全没有。那些大多数"缺少的DLL"错误是关于;一些静态导入库试图找到一个不存在的DLL。

所以...如果我想编写一个至少使用OpenGL 3.3的应用程序,但是如果它们存在则能够使用OpenGL 4.5的功能呢?我无法链接到OpenGL 4.5导入库,因为它无法加载amy 3.3实现。所以我必须链接到OpenGL 3.3的导入库。但是,我如何访问4.5功能?没错:如果它们存在,我必须加载函数指针。

所以大多数人不得不加载一些 的功能。加载整个东西要干得多。这样,您就不必拥有版本化的导入库。

此外,通过动态加载所有OpenGL函数,您不必等待操作系统供应商更新其DLL,然后才能使用下一组OpenGL函数。主DLL只提供与实际实现OpenGL的IHV驱动程序DLL(或Linux上的开源驱动程序)的连接。

请注意,Microsoft的OpenGL32.dll仍然只提供OpenGL 1.1 。所以我说我们没有等待他们而受益;)

此外,我们有"简单方法":使用OpenGL Loading Library