本文转载自博客中的一部分:原文链接
详细内容如下:
5. 动态链接库与静态链接库
一、静态库与动态库
静态链接库就是程序在编译的过程中将所有的对象文件与相应库文件链接在一起生成可执行文件,程序的运行不再需要其它文件,文件以.a的形式保存;
动态链接库是把库函数的链接的载入放到运行时,程序的运行必须要有所依赖的链接库一起。以.so形式保存;
windows下动态库(DLL),静态库(LIB)
二、 静态链接库、动态链接库各自的特点:
1.动态链接库有利于进程间资源共享
什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有时才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。
C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。
而静态链接库则不同,如果系统中多个程序都要调用某个静态链接库函数时,则每个程序都要将这个库函数拷贝到自己的代码段,显然将占有更大的内存资源。
2. 将一些程序升级变得简单。
用静态库,如果库发生变化,使用库的程序要重新编译。使用动态库,只要动态库提供给该程序的接口没变,只要重新用新生成的动态库替换原来就可以了。
3. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。
程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。“有需求才调入”的原则。
4.由于静态库在编译的时候,就将库函数装载到程序中去了,而动态库函数必须在运行的时候才装载,所以程序执行的时候,用静态库更快些。
参考:静态链接库和动态链接库
6. C/C++编译原理
C/C++编译就是要将C/C++的代码映射到相应的机器码,以及讨论其中的内存管理模式,包括内存的分配,如何使用等等,整型、数组、指针等这些在内存中的实现机制。
C/C++的编译包括几个部分,分别是编译,汇编和链接。
1. 编译,就是将相应的高级语言代码映射到汇编语言,处理define,include等命令,加载外部的代码;
2. 汇编,就是将汇编语言映射到机器码;
3. 链接,形成相应的动态和静态链接库。动态连接库是在程序运行时动态的加载,静态连接库是直接拷贝进入程序,在程序执行时,这些静态连接库加载进来。
静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
备注:静态库在程序的发行时是不需要发布库的, 因为静态链接就是将程序所需的所有程序直接拷贝到程序中来。
在应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在连接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。为了克服这个缺点可以采用动态连接库。这个时候连接器仅仅是在可执行文件中打上标志,说明需要使用哪些动态连接库;当运行程序时,加载器根据这些标志把所需的动态连接库加载到内存。
备注:动态库,肯定需要将程序与动态库一起发布,这样就可以减少程序的大小。
参考:C/C++编译原理