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

时间:2012-07-18 23:58:25

标签: c opengl glut

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

  

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

不,这不是那么简单。

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

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

  

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

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

  

为什么指示告诉我要把它们全部三个?

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

  • 获取功能签名(.h)
  • 告诉您的可执行文件加载某个DLL(.lib)
  • 以.dll
  • 的形式获取实际的库
  

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

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

答案 2 :(得分:3)

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

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