我们不会种田,但并没有饿死,我们不会织布,也并没有冻死,因为我们的生活是基于别人的“库”之上的,这些日常生活的库,指的就是饭店、服装店等这些被封装好了的丰富的功能提供者,我们要做的仅仅是:买!在编程开发的世界中,相同的事情也在上演。
我们今天,就来聊聊关于编程开发中的库文件的事儿。首先你得搞明白,库文件英文叫library,意即图书馆或档案,因此库(图书馆)就是包含了一堆可重定位文件(图书)的地方。
而我们知道,如果我们要看书,可以到商业书城去买书,也可以到学校图书馆去借书。卖书的书城相当于静态库,借书的图书馆相当于动态库。这两种模式,各有千秋,表述如下:
什么是 静态库
记住,静态库就是只卖不借的商业书城。其特点是:
1,某一本书如果有大量读者,那么每一位读者都将拥有各自独立的一册图书,互不干扰。 2,需要大量的空间来存放这些相同的书籍。 3,书籍一旦卖出,读者的阅读体验将与书城无关。 4,把书买回家的读者,什么时候想看书就立即可看,非常方便。
对应这些特点,静态库的表现就是:
1,库中的某一段代码如果有大量引用,那么每一个引用了这些代码的程序都将拥有各自独立的一份代码拷贝,互不干扰。 2,需要大量的硬盘和内存空间来存放这些相同的代码。 3,程序一旦编译完成,之后的运行将不再依赖于静态库。 4,将静态库代码拷贝走了的程序,任何时候想要运行即刻就可以运行,不再需要重新链接静态库,非常方便
可以看出,静态库就是这么个书城,需要大量的空间来存放一大堆图书,因为这些图书都有大量的读者,虽然每个人都可以把书拿回家,想翻就翻,但世界上任何事情都是有代价的 —— 你必须囤积大量的库存和空间。
对照着,再来来看看动态库是怎么回事。
什么是 动态库
记住,动态库就是只借不卖的学校图书馆。其特点是:
1,馆中的图书概不出售,想要看某一本书的读者可以预约(编译),届时到图书馆直接看即可(运行)。 2,N个读者可以同时一起看同一本书,而不需要多份拷贝。 3,读者预约(编译)之后,需要依赖于图书馆的存在才能阅读(运行)。 4,万一某天图书馆发生火灾,或者学生搬离了校区,将无法继续使用原本预约了的图书。 5,每次阅读(运行)的时候,都要临时跑到图书馆去,而不是即刻拿起手边的书来读,效率有一点点折扣。
对应这些特点,动态库的表现就是:
1,动态库的代码,在程序编译的时候做链接检测,重定位全局符号,但并不将代码拷贝到程序之中,而是等到运行的时候再来链接。 2,N个程序可以同时链接到同一个动态库,共享同一段代码。 3,链接动态库的程序,运行的时候需要依赖于该动态库。 4,万一某天该动态库不可用,或者程序搬到别的无该库支持的平台,则程序无法运行。 5,运行的时候需要临时链接,效率比静态库的直接运行要低一点点。
综上所述,动态库跟静态库各有所长,但权衡利弊,动态库节省了大量的空间,牺牲了一点点的效率,因此动态库相对而言运用更加广泛。
静态库和动态库,都是由一堆所谓的可重定位文件(即.o后缀的文件)组成的,他们的制作命令很简单,如下所示:
1,将 a.o 和 b.o 制作为动态库:
gcc -shared -fPIC -o libx.so a.o b.o
2,将 a.o 和 b.o 制作为静态库:
ar rcs liby.a a.o b.o