静态库动态库回顾

动态库静态库概念

静态库的概念是从很多个程序的编译需要同样的子模块这个问题产生的,静态库的解决方法是将若干个子模块各自编译成可重定向的二进制文件(.o),再通过工具打包成一个静态库,这样当链接的过程中,当缺少哪些符号时,就从静态库中查询,并把相应的定义提取出来。所以静态库可以看做是一个.o文件的集合,大家在编译中各取所需。在 linux 中的格式为.a

但是由于静态库对于每次链接,都是将自身的程序片拷贝进相应的程序中,形成二进制文件,这就带来了存储器的浪费问题。试想几乎所有的程序都要使用printf.o,使用静态库的话,就意味着所有的程序的二进制文件都要带有 printf 代码的拷贝,开销就很大了。同时,静态库的函数的维护也有一定的问题,使用者在使用前必须了解目前的版本和目前静态库中的功能。动态库则解决了上述的两个问题,首先,动态库在创建之后在与其他程序的链接过程中,其他程序只是包含有动态库的路径,符号信息,并未直接解析符号,而在程序被加载近存储器运行时,才回去动态将需要的文件加载进来,再进行重定向操作。同时,动态库修改后,只需要将新的动态库替换原先的动态库,在下一次的程序运行中就可以实现性能更新了,所以动态库其实也实现了主程序和部分功能的隔离,可以实现部分功能组件的 “热插拔”。

静态库动态库的产生

静态库和动态库的产生采用 linux 中相应的工具argcc

生成一个静态库,使用如下命令

ar rcs libXXX.a XX1.o XX2.o 

其中r指在库中插入模块(替换) c指创建一个库 s指创建目标文件索引

了解静态库信息

ar -tv libXXX.a

显示库文件中的目标文件,文件名,大小,时间等信息。

生成一个动态库,使用如下命令

gcc -shared -fPIC -o libXXX.so XXX.o

shared指产生共享库,fPIC指产生与位置无关的代码(没有绝对地址,只有相对地址,代码被加载器加载到内存的任意位置,都可以正确地执行)。

原文地址:https://www.cnblogs.com/nearmeng/p/4066523.html