.h,.lib& .dll一起工作

时间:2011-06-20 18:47:00

标签: c++ visual-studio-2010

要使用FreeGlut librarie功能,我必须执行以下操作,

  • 将freeglut.h添加为头文件
  • 将freeGlut.lib添加为资源文件
  • 将freeGlut.dll复制到我的windows / SysWOW64文件夹

但是,整个系统(.h,.lib& .dll)之间是如何相互关联的?

我知道,最基本的事情是添加带有类声明的头文件,并在其各自的源文件中写入正文。最后将头文件包含在主应用程序中。

3 个答案:

答案 0 :(得分:22)

您必须包含头文件,以便编译器能够理解库公开/使用的各种类型和函数的声明。

库文件(lib或dll)包含使用库链接到的代码所链接的目标代码。

对于lib,链接是静态的并且在编译时发生。使用静态库(lib)会导致可执行文件的大小增加,因为整个lib链接到您的程序。

对于dll,链接是动态的,并且调用是在运行时计算的。当使用dll时,可执行文件的大小不会增加,因为dll是在运行时链接的,您通常需要将它们放在预定义的路径上,以便它们可以链接在运行时。

静态库优于dll的优点是你使用lib的可执行文件是独立的,而在dll的情况下,dll需要出现在运行使用它的可执行文件的预定义路径上。

答案 1 :(得分:20)

头文件声明了所有内容,以便编译器知道您将提供它。

.lib文件用于告诉链接器在哪里找到实现 - 通常它们只是打包在.lib本身,但在这种情况下你有一个导入库,所以它说“在.DLL中我将在运行时动态加载“。

.dll文件是实现,在运行时加载。通常,您不会将其复制到您的系统文件夹,而是将它们保留在包含.exe。

的文件夹中

答案 2 :(得分:3)

.h文件是编译步骤所必需的:它声明了FreeGLUT中可用的函数,结构和签名集,以便编译器可以对它们进行编码。

.lib文件对于链接步骤是必需的:此时您将拥有一组引用FreeGLUT函数但没有实际定义/实现的目标文件。在这种情况下,它会将它们定义为从FreeGLUT.DLL导入的DLL,并在加载时解析。

.dll文件是代码实际存在的位置,是运行时所必需的。它需要在您的路径中的某个位置,或者在您运行代码的目录中,以便Windows可以找到它。请注意,SysWOW64几乎肯定是错误的地方;您需要设置Visual Studio将其复制到bin \ debug目录中或将其放在其他位置并将该目录添加到PATH环境中(然后重新启动Visual Studio以将其拾取)。