动态库与静态库

来源:互联网 发布:js append 编辑:程序博客网 时间:2024/06/06 09:04

库从本质来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分为静态库与动态库两种,用于将相似函数打包在一个单元中。这些单元可以为其他开发人员所共享,因此有了模块化编程的说法。

静态库:静态库包含在编译时静态绑定到一个程序的函数。这类库的名字一般是libxxx.a,利用静态库编译的文件比较大,因为整个函数的所有数据都会被整合到代码中,它的优点就是编译后的执行文件不需要依赖于函数库的支持,因为所有用到的函数都被编译成可执行文件了,当然这也是他的缺点,因为如果函数库改变了,你的程序必须重新编译,并且体积比较大。

动态库:这类库名字一般是libxxx.so,相对于静态库。动态库在编译的时候没有被编译进目标代码中,你的程序执行到相关的函数的时候才调用函数库里的相应函数,因此动态函数所产生的可执行文件比较小。但由于函数没有被整合进你的程序里,则程序要跑起来就必须需要运行环境中提供相应的库。所以静态库的缺点就是动态库的优点,动态库升级方便,也可以简小明程序的体积。

了解了库,再来看看它们分别是怎么制作出来的。静态库其实是很多的.c文件gcc编译后的可执行文件的打包,把这个包叫做libxxx.a。具体指令如下:

#假如当前路径有hello.c ,eat.c,run.c,sleep.c四个.c文件

gcc hello.c

gcc eat.c

gcc run.c

gcc sleep.c

ar -rcs libman.a hello.o eat.o run.o sleep.o

这样一个叫做libman.a的静态库就做好啦,关键指令ar -rcs  

动态库的制作

gcc  -shared  -fpic  -o  libman.so  hello.c  eat.c   run.c  sleep.c

生成一个libman.so的文件