为什么我需要glut.h,glut32.lib,glut32.dll ALL来编译一个openGL程序?

据我所知,.lib文件是某种编译文件,当然dll文件包含其中的所有函数。 为什么我不能只使用.lib文件或.dll文件? 为什么说明书告诉我得到所有这三个?

顺便说一句,openGL文件是不是免费的,反正我们有一个“freeGLut”?

据我所知,.lib文件是某种编译文件,当然dll文件包含其中的所有函数。

不,这不是那么简单。

DLL是可执行的二进制文件,减去启动入口点。 DLL导出一些符号,但这些符号没有特征,只在地址空间中有位置。 编译器不能从标准DLL(或SO)推导出每个符号具有的签名 。 为此,需要通过其他来源以某种方式告知签名。 这是头文件(.h)。

但是,为了实际上有用,必须在执行时将DLL加载到进程中。 为此,可执行文件需要使用其他信息进行扩充,即要加载的DLL。 在Windows下,这是使用存根库(.lib)完成的,该存根库仅包含该DLL导入信息。 在其他操作系统上,您通过将链接器指向该链接来链接“DLL”。

为什么我不能只使用.lib文件或.dll文件?

因为.lib不包含实际代码而只包含信息,因此使用某个DLL。 并且因为Microsoft工具无法从目标DLL中提取其动态链接信息。

为什么说明书告诉我得到所有这三个?

因为每个文件都有一个特定的function,你需要它们全部三个

  • 获取function签名(.h)
  • 告诉你的可执行文件加载某个DLL(.lib)
  • 并以.dll的forms获取实际的库

顺便说一句,openGL文件是不是免费的,我们有一个“freeGLut”?

GLUT不是OpenGL的一部分。 这是一个独立开发的图书馆。 OpenGL本身也只是一个规范,没有“OpenGL”源; 只有特定的实现,其中一些是免费的。

  • glut32.h是编译阶段使用的头文件
  • glut32.lib是链接器用来解析glut32库提供的函数和/或对象引用的库文件。 与DLL一起使用时,.lib文件通常称为“导入库”,而不是实际代码,它具有链接器用于使可执行文件隐式引用DLL中的函数的信息,因此运行时加载程序也将加载DLL在运行时加载可执行文件时。 一些工具链提供了一个工具(通常称为implib ),它可以使用DLL作为输入生成导入库。
  • glut32.dll是在运行时用于在可执行时提供函数和对象的动态库。

某些工具(例如GCC工具链)可以直接使用DLL代替.lib文件 – 实际上提供了自己的implibfunction。 我不确定Microsoft为什么不在他们的工具中支持它。

GLUT是一个可选组件。 如果您的程序不使用它,则不需要它。 但是如果你使用它,你需要glut.h因为你的程序#include s it,并且你需要glut32.lib因为它是链接器用来建立你的可执行文件与DLL的关系的导入库 。 编译或链接程序时不需要glut32.dll (因为导入库用于此目的),但是在运行程序时需要它,因为它包含程序正在调用的实际GLUT函数。

Freeglut是原始GLUT的开源克隆,因为原始GLUT已过时,其许可证不允许其他人进行更改以改进它。