当前位置: 技术问答>linux和unix
静态库,动态库,静态链接和动态链接
来源: 互联网 发布时间:2016-12-01
本文导语: 向各位大虾请教下: 对静态库和动态库,以及动态链接和静态链接四个概念比较模糊,上网搜索, 发现没有个明确的答案,望高手能详细说下。 1.静态库是什么? 2.动态库是什么? 3.两者的区别? 4.动态链接? 5.静态...
向各位大虾请教下:
对静态库和动态库,以及动态链接和静态链接四个概念比较模糊,上网搜索,
发现没有个明确的答案,望高手能详细说下。
1.静态库是什么?
2.动态库是什么?
3.两者的区别?
4.动态链接?
5.静态链接?
6.动态链接和静态链接的区别?
7.最后,静态库是否可以动态链接?动态库是否可以静态链接
有谁知道这些概念在什么比较权威的书上论述也说下.
先附个人愚见:
1.程序装载时,将其一并加载
2.程序运行时加载
3.区别:静态库可能在内存中有多个备份存在,因为有可能有多个程序要加载各自的静态库
动态库只可能在内存中有一份,多个程序共享使用
4.在链接程序时,不对库进行打包
5.在链接程序时,对库进行打包
6.动态链接,导致程序将其从编译机到别的机器时,需要将库一起拷贝
静态链接不存在上述问题
7.不清楚
一个问题10分,总分70.望高手不吝赐教
谢谢!
对静态库和动态库,以及动态链接和静态链接四个概念比较模糊,上网搜索,
发现没有个明确的答案,望高手能详细说下。
1.静态库是什么?
2.动态库是什么?
3.两者的区别?
4.动态链接?
5.静态链接?
6.动态链接和静态链接的区别?
7.最后,静态库是否可以动态链接?动态库是否可以静态链接
有谁知道这些概念在什么比较权威的书上论述也说下.
先附个人愚见:
1.程序装载时,将其一并加载
2.程序运行时加载
3.区别:静态库可能在内存中有多个备份存在,因为有可能有多个程序要加载各自的静态库
动态库只可能在内存中有一份,多个程序共享使用
4.在链接程序时,不对库进行打包
5.在链接程序时,对库进行打包
6.动态链接,导致程序将其从编译机到别的机器时,需要将库一起拷贝
静态链接不存在上述问题
7.不清楚
一个问题10分,总分70.望高手不吝赐教
谢谢!
|
我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份共享函数库中函数的副本。
========
这句话有问题吧?
共享库和静态库完全是两码事。
以Unix共享库为例
1. 共享库的格式和实际上更象是可执行文件格,里面的代码和数据都已经完成链接,用加载器载入内存后可以生成执行镜像,只是缺少一个入口点;动态连接的动作是在执行程序用加入链接信息,这样在程序执行时就可以有加载器将共享库映射到执行程序的地址空间中,执行程序就可以执行库中的函数了。
2. 静态库实际上就是.o文件的集合.
“在程序本身拥有一份共享函数库中函数的副本”的说法是不准确的。
当然在有些情况下,为了部署程序的便利,需要使用静态链接,这时可以使用-static选项,但是这并不是说“在程序本身拥有一份共享函数库中函数的副本”,而是这些程序库同时提供了静态库和共享库,用-static指示链接器链接静态库。
如果只有库.so没有.a链接 -static链接是不会成功的。
|
了解了他们的概念也就知道区别了吧
关于4 5 6
这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamically Linked)。但有时为了程序调试方便或其它原因,我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份共享函数库中函数的副本。这种方式我们称之为静态链接(Statically Linked)。
关于4 5 6
这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamically Linked)。但有时为了程序调试方便或其它原因,我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份共享函数库中函数的副本。这种方式我们称之为静态链接(Statically Linked)。
|
补充,动态库,又叫共享库,这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数 库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须 提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。