动态链接库与静态链接库的区别

静态库

静态库是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量 与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与链接器将它集成至应用程序 内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件 的程序,都是一种程序的静态创建(static build)。

动态库

静态库很方便,但是如果我们只是想用库中的某一个函数,却仍然得把所有的内容都链接进 去。一个更现代的方法则是使用共享库,避免了在文件中静态库的大量重复。 动态链接可以在首次载入的时候执行(load-time linking),这是 Linux 的标准做法,会由动 态链接器ld-linux.so 完成,比方标准 C 库(libc.so) 通常就是动态链接的,这样所有的程序可 以共享同一个库,而不用分别进行封装。 动态链接也可以在程序开始执行的时候完成(run-time linking),在 Linux 中使用 dlopen() 接口来完成(会使用函数指针),通常用于分布式软件,高性能服务器上。而且共享库也可以 在多个进程间共享。

链接使得我们可以用多个对象文件构造我们的程序。可以在程序的不同阶段进行(编译、载 入、运行期间均可),理解链接可以帮助我们避免遇到奇怪的错误。

区别:

使用静态库的时候,静态链接库要参与编译,在生成执行文件之前的链接过程中,要将静态链 接库的全部指令直接链接入可执行文件中。而动态库提供了一种方法,使进程可以调用不属于 其可执行代码的函数。函数的可执行代码位于一个.dll文件中,该dll包含一个或多个已被编 译,链接并与使用它们的进程分开储存的函数。 静态库中不能再包含其他动态库或静态库,而在动态库中还可以再包含其他动态或者静态库。 静态库在编译的时候,就将库函数装在到程序中去了,而动态库函数必须在运行的时候才被装 载,所以使用静态库速度快一些。