链接库是什么(动态链接库和静态链接库)
静态链接库和动态链接库是最常用的两种共享代码的方法,从本节开始,您将系统地了解它们,并彻底搞清楚以下问题:
什么是库,什么是链接库,以及静态链接库和动态链接库的区别;
如何手动创建一个静态或者动态链接库;
如何在自己的项目中使用第三方提供的静态或者动态链接库。
首先我们来了解一下库和链接库的含义。
什么是链接库
计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)。以 C 语言为例,如下为大家展示的就是一个函数库:
myMath.c 文件中包含 4 个函数,它们分别可以完成两个整数的加法、减法、乘法和除法运算。myMath.c 库文件的用法也很简单,直接将它添加到某一个 C 语言项目中,就可以直接调用文件中的 4 个函数,每个函数可以调用多次。//myMath.c
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
if (b != 0) {
return a / b;
}
return -1;
}
显然,实际开发中引入他人编写好的库文件可以省略某些功能的开发环节,提高项目的开发效率。但遗憾的是,类似 myMath.c 这种“开源”的库文件很难找到,多数程序员并不会直接分享源代码,他们更愿意分享库文件的二进制版本——链接库。
所谓链接库,其实就是将开源的库文件(例如上面提到的 myMath.c)进行编译、打包操作后得到的二进制文件。虽然链接库是二进制文件,但无法独立运行,必须等待其它程序调用,才会被载入内存。
一个完整的 C 语言项目可能包含多个 .c 源文件,项目的运行需要经过“编译”和“链接”两个过程:
编译:由编译器逐个对源文件做词法分析、语法分析、语义分析等操作,最终生成多个目标文件。每个目标文件都是二进制文件,但由于它们会相互调用对方的函数或变量,还可能会调用某些链接库文件中的函数或变量,编译器无法跨文件找到它们确切的存储地址,所以这些目标文件无法单独执行。
- 链接:对于各个目标文件中缺失的函数和变量的存储地址(后续简称“缺失的地址”),由链接器负责修复,并最终将所有的目标文件和链接库组织成一个可执行文件。
注意,一个目标文件中使用的函数或变量,可能定义在其他的目标文件中,也可能定义在某个链接库文件中。链接器完成完成链接工作的方式有两种,分别是:
无论缺失的地址位于其它目标文件还是链接库,链接库都会逐个找到各目标文件中缺失的地址。采用此链接方式生成的可执行文件,可以独立载入内存运行;
链接器先从所有目标文件中找到部分缺失的地址,然后将所有目标文件组织成一个可执行文件。如此生成的可执行文件,仍缺失部分函数和变量的地址,待文件执行时,需连同所有的链接库文件一起载入内存,再由链接器完成剩余的地址修复工作,才能正常执行。
我们通常将种链接方式称为静态链接,用到的链接库称为静态链接库;第二种链接方式中,链接所有目标文件的方法仍属静态链接,而载入内存后进行的链接操作称为动态链接,用到的链接库称为动态链接库。
静态链接的过程由静态链接器负责完成,动态链接的过程由动态链接器负责完成。链接器的实现机制和操作系统有关,例如 Linux 平台上,动态链接器本质就是一个动态链接库。
静态链接库和动态链接库
也就是说,程序完成链接操作的方式有两种,一种是在生成可执行文件之前完成所有链接操作,使用的库文件称为静态链接库;另一种是将部分链接操作推迟到程序执行时才进行,此过程使用的库文件称为动态链接库。1) 静态链接库
静态链接库用来和所有的目标文件一起组织成可执行文件,生成的可执行文件可以独立运行。采用静态链接库完成链接操作,存在诸多缺点。首先,可执行文件内部拷贝了所有目标文件和静态链接库的指令和数据,文件本身的体积会很大。当系统中存在多个链接同一个静态库的可执行文件时,每个可执行文件中都存有一份静态库的指令和数据,就会造成内存空间的极大浪费。
此外,一旦程序中有模块更新,整个程序就必须重新链接后才能运行。假设一个程序有 20 个模块构成,每个模块的大小为 1 MB,那么每次更新任何一个模块,用户就必须重新获取 20 MB 的程序,对用户很不友好。
2) 动态链接库
实际上,动态链接库是 Windows 平台上对动态链接过程所用库文件的称谓,Linux 平台上习惯称为共享库或者共享对象文件,它们表达的是一个意思。所谓动态链接,指的是将链接的时机推迟到程序运行时再进行。具体来讲,对于一个以动态链接方式运行的项目,首先由静态链接器将所有的目标文件组织成一个可执行文件,运行时将所需的动态链接库全部载入内存,由动态链接器完成可执行文件和动态库文件的链接工作。
和静态链接库相比,动态链接库可以很好地解决空间浪费和更新困难的问题。动态链接库和可执行文件是分别载入内存的,因此动态链接库的体积通常会小一些。当有多个程序使用同一个动态链接库时,所有程序可以共享一份动态链接库的指令和数据,避免了空间的浪费。采用动态链接的方式也可以方便程序的更新和升级,当程序的某个模块更新后,只需要将旧的模块替换掉,程序运行时会自动将所有模板载入内存并动态地链接在一起。动态链接库可以随可执行文件一同载入内存,也可以在可执行文件运行过程中载入,即可执行文件什么时候需要,动态链接库才会载入内存。
有读者可能会问,采用动态链接的方式,每次程序运行时都需要重新链接,会不会很慢?的确,动态链接确实会损失一部分程序性能,但实践证明,动态链接库和静态链接相比,性能损失大约在 5% 以下,由此换取程序在空间上的节省以及更新时的便利,是相当值得的。
了解了静态链接库和动态链接库之后,接下来我们继续学习如何创建它们。
- 随机文章
- 鲨鱼酒店马尔代夫(马尔代夫建成全球首家鲨鱼形态酒店)
- 中国 马尔代夫 下载(中国游客入境马尔代夫处境良好)
- 东方马尔代夫公司(东方马尔代夫公司宣布最新旅游业动态)
- 东方马尔代夫玩法(探索东方马尔代夫:如何玩转度假胜地)
- 北碚澄江马尔代夫(北碚新鲜出炉!重返度假天堂马尔代夫)
- 印度强占马尔代夫(印度占领马尔代夫,引发地区紧张局势)
- 在马尔代夫玩滑板(在马尔代夫体验滑板运动,刺激好玩!)
- 动态背景马尔代夫(沉浸在青蓝海水中,马尔代夫无限美好)
- 亚洲地图马尔代夫(美丽的印度洋岛国:马尔代夫地图解析)
- 斐济 马尔代夫 塞舌尔(三大海岛天堂,斐济 马尔代夫 塞舌尔再次成为旅游新热点)
- 冬季 马尔代夫(马尔代夫:冬季海岛度假天堂)
- 低价马尔代夫旅游(花小钱游马代,海岛豪华度假村优惠多)
- 中国 马尔代夫 签证(中马签证正式签署 生疏双方商务合作)
- 曲阳马尔代夫文案(极致浪漫之旅,曲阳马尔代夫等你来!)
- 帕劳马尔代夫旅行(体验珊瑚海之美,畅游帕劳马尔代夫!)
- 蓝途 马尔代夫(蓝途:寻访马尔代夫的哪吒宝宝)
- 于洋马尔代夫度假(马尔代夫度假胜地,你绝对不能错过!)
- 梦想 马尔代夫(实现梦想:探索马尔代夫之美)
- 中国 马尔代夫 球场(中国马尔代夫合作建设多功能球场)
- 阿狸 马尔代夫(阿狸游马尔代夫)
- 大洋彼岸马尔代夫(马尔代夫:一个在大洋彼岸的度假胜地)
- 徒步到达马尔代夫(徒步探索马尔代夫:步行穿越美丽海岛)
- 湛江马尔代夫旅游(湛江出发,享受马尔代夫海岛度假之旅)
- 聂远马尔代夫电影(聂远马尔代夫电影,为你揭开神秘面纱)
- 芜湖马尔代夫旅行(纯净无尘的马尔代夫之旅——芜湖出发)
- 涿州马尔代夫露营(涿州旅游新玩法:马尔代夫风情露营!)
- 西沙秒杀马尔代夫(西沙击败马尔代夫,成为中国人新宠!)
- 渝版马尔代夫攻略(重走渝味马尔代夫,打造轻松海岛假期)
- 悉尼飞到马尔代夫(悉尼至马尔代夫航线开通,欢迎预订!)
- 蓝色马尔代夫蛋糕(美味马尔代夫蛋糕:享受独特味蕾之旅)
