头文件和库文件有什么区别?

83

我很难理解编译器是如何工作的,特别是在处理头文件和库文件时容易混淆。希望有人能够帮我澄清一下。


1
C和C++是不同的编程语言。它们都是规范- 而非软件!- 根据某些标准编写的(主要用英语编写),例如[n1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)用于C和[n3337](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)用于C ++。 - Basile Starynkevitch
16个回答

133

可以这样形象地理解(免责声明:这是一个非常高级的比喻😉):

  • 头文件就像一个电话号码,你可以拨打这个号码,而...
  • ...库文件就是你最终想要联系到的人!

这就是“接口”和“实现”的基本区别;接口(头文件)告诉你如何调用一些功能(而不需要知道它是如何工作的),而实现(库文件)则是真正的功能。

请注意:这个概念非常基础,因为它让你具有灵活性:你可以针对不同的库使用相同的头文件(即以完全相同的方式调用功能),每个库可能会以不同的方式实现功能。通过保持相同的接口,你可以在不改变你的代码的情况下替换库。

此外:你可以更改库的实现而不会破坏调用代码!


2
额...我还是不太明白这里的一些东西。首先,我甚至不确定库是如何派生的,我编译的所有程序似乎都不需要它们 - 它们只是没有生成。我假设需要定义库?但是忽略这个问题,主源文件在哪里发挥作用?我认为头文件是用于实现的,而主源文件是用于接口的 - 库只有在编译可执行文件时才是必需的...如果它们是静态的话。 - Xonara
2
库是编程的一部分:你可以编写一个程序,或者编写一个库。 - TomTom
2
如果我从其他人那里获得了一个库,例如 Util.lib,我如何调用它的函数?我需要包含与 Util.lib 相关的头文件吗? - Elshan
关于“头文件”这一点,我明白了你的意思,但是关于实现,我仍然感到困惑。因为通常情况下,“源文件”包含了实现,对吗?如果我们已经有了“源文件”,那么我们为什么还需要“库”呢?非常感谢您的帮助! - Milan

61

头文件一般用于定义应用程序中的接口或一组接口。 可以将头文件视为显示程序的外部功能,同时省略技术实现细节的内容。

例如,如果您要优化程序,则很可能会修改源(.cpp)文件以改进算法,但是头文件不会更改,因为外部客户端仍然使用相同的参数和返回值调用方法。

在像C ++这样的面向对象语言中,头文件通常包括以下内容:

  • 类描述和继承层次结构
  • 类数据成员和类型
  • 类方法

虽然代码可以在头文件中实现,但通常不建议这样做,因为它可能会在代码中引入额外的耦合和依赖关系。

在某些情况下(例如模板类),出于技术原因,必须在头文件中定义实现。


是一组代码,您希望将其提供给程序或一组程序使用。 它包括特定接口或一组接口的实现

在库中定义代码可避免代码重复,并鼓励重用。 库可以进行静态链接(.lib)或动态链接(.dll):

  • 静态链接库定义一组导出符号(可以视为方法定义),然后在构建过程的链接阶段将它们链接到最终可执行文件(.exe)中。 它具有更快的执行时间的优点(因为不需要动态加载库),代价是二进制文件较大(因为方法实际上是在可执行文件中复制的)。

  • 动态链接库在程序执行期间进行链接,而不是程序链接时。 当多个程序需要重用相同的方法时,它非常有用,并且在诸如COM等技术中广泛使用。


那么,这是否意味着当我的.c文件(其中包含stdio.h文件中的所有文本+我的源文件)被编译为对象文件(.o文件)时,它不包含实际与I/O设备交互的代码? - Sandeep
“它具有更快的执行时间”的优势 - 并非总是如此。当某个库已经被其他程序加载到内存中(因此减少了当前程序的加载时间)时,动态链接程序可能会更快地运行。 - avm

11

可能会让你感到困惑的是,在C++中,单词library可以有几种不同的含义。其中一种意义已在这里得到了很好的讨论:

二进制文件中可链接函数的集合。这些函数可以静态链接或动态链接。

但是还有另一种类型的库:所谓的头文件库(包括STL、TR1和Boost的部分)。它们并不存在于单独的二进制形式中,因此单词library并不指代特定的二进制文件,而是指代一组包含的头文件。

希望这可以帮到你。


9

头文件只包含声明,而库文件还包含实现。


8

一个库是编译成一组目标文件的代码。这些目标文件包含了编译后的机器代码和代码所使用的数据声明。

头文件定义了库的接口:它告诉你如何正确地使用库。在C/C++中,头文件给出了函数名称列表以及如何调用这些函数的方法:它们所需的参数数量和类型、返回类型、调用约定等等。头文件还有很多其他内容,但归根结底,它们都是为了调用库代码而制定的一套规则。


2

头文件通常用于包含原型。头文件在预处理时扩展,以便在编译时,代码可以访问相关的函数声明/原型。

库是实际包含函数原型定义的软件(在头文件中)。库在链接时使用。定义(在库中)在链接时解析。

最初的回答:

头文件包含函数原型,库包含函数原型的定义。头文件在预处理时扩展,以便在编译时访问函数声明。库在链接时使用,并在链接时解析函数定义。


2
如果编程语言中的库是一般化的,那么图书馆中的许多书籍可以与语言中的函数/方法进行比较。同时,头文件可以与书的排列号码进行比较。 假设在海得拉巴的某个图书馆里有一本书,该书在第24行…同样,使用命名空间std(表示标准库)来给出图书馆的地址,而行号则通过头文件给出,其中所有同类型的书籍(在这种情况下是所有与输入/输出流相关的方法)都被收集在一起。

1

头文件是声明函数的文件。使用头文件可以访问特定的函数。

库文件则是定义特定函数的文件。 MATH.H是一个头文件,而MATH.LIB则是库文件。


1

一个库是为偶尔使用而收集的类似对象的集合。它通常包含以对象或源代码形式的程序、模板等。

头文件是库的位置(接口)。


1

头文件和库在程序中的工作原理。

头文件包含指向的链接(库包含标准函数和方法),编译器通过预处理器识别源代码中使用的标准函数,预处理器在程序实际编译之前解析所有指令(指令是以 # 符号为前缀的程序行,其中包括)。

感谢阅读!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接