据我所知,.lib 文件是某种编译文件,当然 dll 文件包含其中的所有函数。为什么我不能只使用 .lib 文件或 .dll 文件?为什么说明告诉我要获得所有三个?
顺便说一句,我们有一个“freeGLut”,openGL 文件不是免费的吗?
glut32.h
是编译阶段使用的头文件glut32.lib
是链接器用来解析对库提供的函数和/或对象的引用的库文件glut32
。当与 DLL 一起使用时,.lib 文件通常称为“导入库”,它包含链接器用来使可执行文件隐式引用 DLL 中的函数的信息,而不是实际代码,因此运行时加载程序也将加载 DLL在运行时加载可执行文件时。一些工具链提供了一个工具(通常称为implib
),它可以使用 DLL 作为输入来生成导入库。glut32.dll
是在运行时用于在可执行时提供函数和对象的动态库。一些工具(例如 GCC 工具链)可以直接使用 DLL 代替 .lib 文件 - 实际上提供了自己的implib
功能。我不确定为什么微软在他们的工具中不支持这一点。
据我所知,.lib 文件是某种编译文件,当然 dll 文件包含其中的所有函数。
不,没那么简单。
DLL 是可执行二进制文件,减去启动入口点。DLL 导出一些符号,但这些符号没有特征,只是地址空间中的位置。编译器无法从标准 DLL(或 SO)中推断出每个符号的签名。为此,需要通过其他来源以某种方式告知签名。这是头文件 (.h)。
然而,为了真正有用,DLL 必须在执行时加载到进程中。为此,可执行文件需要增加附加信息,即要加载的 DLL。在 Windows 下,这是使用存根库 (.lib) 完成的,该库仅携带该 DLL 导入信息。在其他操作系统上,您可以通过将链接器指向该“DLL”来链接该“DLL”。
为什么我不能只使用 .lib 文件或 .dll 文件?
因为 .lib 不包含实际代码而只包含信息,所以要使用某个 DLL。并且因为 Microsoft 工具无法从目标 DLL 中提取其动态链接信息。
为什么说明告诉我要获得所有三个?
因为每个文件都有一个特定的功能,你需要这三个文件
顺便说一句,我们有一个“freeGLut”,openGL 文件不是免费的吗?
GLUT 不是 OpenGL 的一部分。这是一个独立开发的库。此外,OpenGL 本身只是一个规范,没有“那个”OpenGL 源代码;只有特定的实现,其中一些是免费的。
GLUT 是一个可选组件。如果你的程序不使用它,你就不需要它。但是如果你使用它,你需要它glut.h
是因为你的程序#include
是它,你需要glut32.lib
它是因为它是链接器用来建立可执行文件与 DLL 关系的导入库。在编译或链接程序时不需要glut32.dll
它(因为导入库用于此目的),但在运行程序时需要它,因为它包含程序正在调用的实际 GLUT 函数。
Freeglut 是原始 GLUT 的开源克隆,因为原始 GLUT 已过时,并且其许可证不允许其他人进行更改以改进它。