据我所知,.lib文件是某种编译文件,当然dll文件中包含了所有函数。为什么我不能只使用.lib文件或.dll文件?为什么说明书告诉我得到所有这三个?
顺便说一下,openGL文件是不是免费的,我们有一个“freeGLut”??
答案 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中提取动态链接信息。
为什么指示告诉我要把它们全部三个?
因为每个文件都有一个特定的功能,你需要它们全部三个
顺便说一句,openGL文件是不是免费的,我们有“freeGLut”?
GLUT不是OpenGL的一部分。它是一个独立开发的库。 OpenGL本身也只是一个规范,没有“OpenGL”源;只有特定的实现,其中 some 是免费的。
答案 2 :(得分:3)
GLUT是一个可选组件。如果您的程序不使用它,则不需要它。但是如果您使用它,则需要glut.h
,因为您的程序#include
是它,并且您需要glut32.lib
,因为它是链接器用来建立可执行文件与之关系的import library DLL。编译或链接程序时不需要glut32.dll
(因为导入库用于此目的),但是当您运行程序时需要它,因为它包含实际的GLUT函数你的程序正在调用。
Freeglut是原始GLUT的开源克隆,因为原始GLUT已过期,其许可证不允许其他人进行更改以改进它。