链接

链接(器)Linking

链接是将各种代码部分和数据部分收集起来并组合为单一文件的过程。

静态库、动态库、运行时库

静态库通过静态链接器链接到程序中,如果程序中对静态库中函数进行重复调用,则静态库会拷贝多份,因此最终得到的程序空间大小在大多数情况下比动态库大,甚至大得多。

动态库也成为共享库,通过动态链接器链接到程序中,在程序静态链接期间只链接了共享库的重定位和符号表信息。在最后程序运行时通过动态链接器将函数调用位置重定位。这样的好处是可以将库进行复用,并且解耦,有利于后面开发者对库进行版本控制。

静态库和动态库各有其优缺点,静态库相对于动态库而言虽然大小可能大的多,但是程序运行速度会比动态库快。动态库的使用虽然能节省空间,

Windows下库形式

静态库

一般以*.lib的方式命名

动态库

一般以*.dll的方式命名,dll的全称是Dynamic Link Library。

在windows下的动态库通常配合引入库使用,一般名为*.lib,不过此时存放的只是函数声明相关信息。

Linux下库形式

静态库

一般以lib*.a方式命名,a表示的是archive,意为归档。

动态库

一般以lib*.so方式命名,so表示的是shared object,共享目标文件。

运行时库

首先了解编译时(compile time)、加载时(load time)、运行时(runtime/run-time/run time)。

编译时是指源代码编写,编译,汇编这几个过程,从源代码到机器代码的过程。

加载时是指程序被**加载器(loader)**加载到内存的过程。

运行时是内存上的程序执行的过程。

运行时库的侧重点在于目前使用的函数库的使用时间。并且在侧重点上更偏向于是编译器或者操作系统提供的库文件。总体而言也就是操作系统或者编译器在程序运行过程中提供给程序的函数库。

常见的运行时库有C++ standard library(libc、glibc)、glib等等。

参考文章

Computer Systems : A Programmer’s Perspective, 2E : Linking