我只是阅读了加载OpenGL函数,并想知道为什么OpenGL的设计方式,而不是简单的方法,提供动态库和相应的标题?
提供动态库和相应的标题?
然后你对"动态库"的工作原理产生了误解.
我们以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加载库.