在​​计算机科学​​中,是用于开发​​软件​​的​​子程序​​集合。库和​​可执行文件​​的区别是,库不是独立​​程序​​,他们是向其他程序提供服务的代码。

库链接是指把一个或多个库包括到程序中,有两种链接形式:静态链接动态链接,相应的,前者链接的库叫做​​静态库​​后者的叫做​​动态库​​。

静态链接[编辑]

静态链接是由​​链接器​​在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由​​编译器​​或​​汇编器​​生成)链接到一块生成可执行程序。

静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。

动态链接[编辑]

动态链接,在可执行文件​​装载时​​或​​运行时​​,由​​操作系统​​的​​装载程序​​加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory 的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载称为装载(load-time)时加载,被包括​​Windows​​和​​Linux​​的大多数系统采用。装载程序在加载应用软件时要完成的最复杂的工作之一就是加载时链接。

其他操作系统可能在运行时解析引用。在这些系统上,可执行程序调用操作系统​​API​​,将库的名字,函数在库中的编号和函数参数一同传递。操作系统负责立即解析然后代表应用调用合适的函数。这种动态链接叫做运行时链接 。因为每个调用都会有系统开销,运行时链接要慢得多,对应用的性能有负面影响。现代操作系统已经很少使用运行时链接。

可以动态链接的库,在​​Windows​​上是dynamic link library (DLL),在​​UNIX​​或​​Linux​​上是Shared Library 。库文件是预先编译链接好的可执行文件,存储在​​计算机​​的​​硬盘​​上。大多数情况下,同一时间多个应用可以使用一个库的同一份拷贝,操作系统不需要加载这个库的多个实例。

动态链接的最大缺点是可执行程序依赖分别存储的库文件才能正确执行。如果库文件被删除了,移动了,重命名了或者被替换为不兼容的版本了,那么可执行程序就可能工作不正常。这就是常说的​​DLL-hell​​。