一文理解头文件与库文件

2,374 阅读6分钟

参考文档资料:

头文件和库文件 - 知乎 (zhihu.com)

关于linux下的库文件_libmagic.so-CSDN博客

头文件与库文件的区别_库函数和头文件的区别-CSDN博客

头文件和库之间的区别|极客教程 (geek-docs.com)

C头文件与库文件的区别-古丁高手-ChinaUnix博客

参考视频资料:动态库与静态库讲解_哔哩哔哩_bilibili

一.头文件

1.含义与使用

1.英文解释与定义

Head File头文件,具体定义为:包含所有"即将在主代码文件中"使用的"头文件名称的文件"被称为 头文件

拆分概念:什么是"即将在主代码文件中使用"?

答:比如你要使用吹风机,你需要先接通电源,再开启吹风机,那么接通电源是一个函数,开启吹风机是一个函数,这两个函数共同能够实现"你使用吹风机"这个目的。而在实际的编程环境中,你要编写以便实现某种功能的相关函数的"名字"(专业一点叫做函数头)会放在头文件中,当然,你不止要使用一个"名字",这样的一个"名字"集合全都被放在了头文件里。

2.文件类型

拓展名通常为".h"

3.如何使用

①通常由程序员自行创建

②预处理器指令#include将会加载头文件,格式为#include <.h>或者#include ".h",具体格式还要根据语言类型决定,以及预处理器指令本身的名称也根据不同语言而不同。

尖括号<>和双引号"代表不同头文件常用的加载方式

<>常用来加载系统头文件(即编译器自带的头文件),一般以特定形式进行搜索(根据操作系统和编译软件不同而不同),双引号"常用来加载用户头文件,先在当前目录下搜索,再以<>的特定形式搜索

2.头文件的功能

提供特定的API及其功能,头文件负责指导编译器如何调用这些功能,以便在主文件中使用

主文件也就是自己的项目文件,可以是C语言、C++、Python等语言编写的文件

同义理解:声明和定义一些外部函数和变量。

解释:"外部"与"内部"是针对文件范围定义的,仅能在文件内部使用的函数叫做内部函数,相反,外部函数能够在文件与文件之间被调用。很显然,内部函数的数量远远不如外部函数(多为程序员自行定义的,根据实际生产生活需要的)。

知识补充:从C源文件到可执行文件的过程(源程序为hello.c--文本)

--预处理及宏定义区域(在main函数前)
#include<stdio.h> //引入了"stdio.h"这个头文件

--main函数体(主程序的唯一入口)
int main(){
    printf("HelloWorld!\n");
    return 0;
}
    

image.png --步骤1预处理Preprocessor:常见的文件后缀".cpp"其实就是预处理器文件(C Preprocessor)。

预处理器执行宏替换条件编译以及包含指定的文件,然后生成一个"中间C文件"即hello.i文件。

--步骤2编译Compile:编译器cc1(gcc的编译组件),把高级语言变成汇编语言,生成hello.s文件。

--步骤3汇编:将汇编语言变成二进制机器语言,生成hello.o文件(只编译不链接)。

--步骤4链接:将二进制机器语言变成可执行程序hello(a.out可执行目标文件),输入./hello即可输出"HelloWorld!"

3.头文件的特点

头文件只有头名称(多个函数的函数名),它只包含函数声明而非包含函数的具体功能实现(即写具体代码实现功能)。 知识补充:C语言中的函数结构

--注:其他语言的结构大体类似,需要具体查找相关资料对应区分即可。

image.png

二.库文件

1.含义与使用

1.含义

包含一个函数主体的文件被称为,库中包括了头文件中函数的具体实现以及与动态库的连接

2.如何使用库文件

1.包含库的头文件 --include

2.使用库中的函数和变量

3.将库文件连接到程序中。--在"连接"这一步实现

2.文件类型

".lib"文件和".dll"文件,分为静态库文件和动态库文件。

静态库.lib文件

含义"library图书馆",象征着图书馆的书往往被人借阅与查看,每本书属于一块儿内存空间,因此借出去的书所占用的空间是累加的关系。

每引用一份lib文件,就会产生一份相应的空间,同样的lib文件会导致内存空间的冗余。

注:图片原创,转载使用请声明出处

b5393362c66ec0cbe4d072733304872.jpg

动态库.dll文件动态库lib文件

含义"dynamic link library动态链接图书馆",象征着图书馆的一本书被人借阅时,倘若此时有别人也要来借阅,则两个人一起看同一本书,极大地节省了内存空间。而有这样的共享书,也需要索引来便于用户去查找,因此dll文件对应的lib文件就是为了实现这样的功能而存在,告诉用户你的书在哪个位置(但仅仅只是告诉--索引功能),也可称之为"动态库的导入库import library",即引入库

8d27d61919fcf005b59c7f92c120914.jpg

两者作用的阶段

.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的

5ccb6ac44e0c76a804a83581b323697.jpg

3.库文件的特点

①本身是二进制代码

②作为商用,用户无法看到库文件的对应源文件,能够最大地保护好源文件代码的隐私性。

③在"连接"环节中调用静态和动态库文件。

4.动态库文件和静态库文件的区别

①在过程上的区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件

动态链接就是把调用的 函数所在文件模块(DLL)调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。

②在内存占用上的区别

静态链接库与动态链接库都是共享代码的方式。

如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。

但是若使用 DLL,该 DLL 不必被包含在最终EXE文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。

静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。