进程篇——了解库文件、静态库及动态库的定义和区别

  1. 什么是库文件

在Windows和linux平台下都大量存在着库。

库文件是预先编译好的方法的集合,都是按照可重用的规则编写的,通常通过一组由相关联的函数组成以执行某项常见的任务。比如说我们提前要写好一些数学公式的实现,将其打包成库文件,然后我们以后只需要使用库文件即可,不用再需要重新编写。

标准系统库文件一般存放的位置是 /lib和/usr/lib目录下。

库文件的名字总是以lib开始,随后部分指明的是什么库(例如c是C语言库,m 是数学库),文件的最后部分以 .开始,后面给出库文件类型。

库文件分为: 静态库 和 动态库(共享库)

    .a 代表传统的静态库

.so代表 共享函数库。

    二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码时在可执行程序运行时才载入内存的,在编译过程中仅仅是简单的使用,因此代码体积较小。

 

我们可以在linux系统下 通过命令 -l  /usr/lib  进行查看,我们也可以通过给出完整的库文件的路径名或者 -l 标志来告诉编译器要搜索的库文件。例如:

$  gcc  -c  fred   fred.c /usr /lib/ libm.a

这条命令要求编译器编译文件fred.c,将编译产生的文件命名为 fred,并且处理搜索标准的C语言函数库外,还搜索数学库以解决函数引用问题。

$  gcc - o  fred  fred.c  -lm

-lm (l和m之间没有空格),它代表的是 标准库目录(此例中是usr/lib)中名为libm.a的函数库。-lm标志的另一个好处就是如果有共享库,编译器就会自动选择共享库。

虽然库文件和头文件一样,通常都保存在标准位置,但你也可以通过使用 -L 标志为编译器增加库的搜索路径。

例如: gcc -o  xllfred  -L/usr/openwin/lib x11fred.c -1x11

用/usr/openwin/lib目录中的 libx11库版本来编译和链接程序 x11fred.

 

2.静态库

函数库最简单的形式是一组处于“准备好使用”状态的目标文件。当程序需要使用函数库的某个函数时,它包含一个声明该函数的头文件。编译器和连接器负责将程序代码和函数库结合在一起以组成一个单独的可执行文件。你必须使用 -l 选项指明标准C语言运行库外还需使用的库。

特点:

程序在链接的过程中,链接器从库文件中取得所需代码,复制到生成的可执行文件中。因此,静态库是在链接阶段被复制到程序当中,和程序的执行过程没有关系。

创建:

Eg:有两个源文件: main.c  max.c

  1. gcc -c main.c max.c (得到main.o  max.o)
  2. 使用ar 将目标文件归档 :ar  crv libxxx.a  main.o  max.o

         **libxxx.a 即为我们创建的静态库

只要使用ar(代表archive,即建立归档文件)程序和 使用 gcc -c 命令对函数分别进行编译。应该尽可能的把函数保存在不同的源文件中。如果函数需要访问公共数据,你可以把他们放在同一个源文件中,并使用该文件中声明的静态变量。

静态库的一个缺点就是,当你同时运行许多应用程序并且他们都使用同一个函数库的函数的时候,内存中就会有一份函数的多个副本,而且在程序中也会有很多的同样的副本,所以这样将消耗大量宝贵的磁盘空间和内存。

 

3.动态库

当一个程序使用共享库时,它的连接方式过程:程序本身不再包含函数代码,而是引用运行时可访问的共享代码。当编译好的程序被装载到内存中运行时,函数引用被解析并产生共享库的调用,如果有必要,共享库才被加载到内存中。

通过这种方法,系统可以只保留一份副本供很多应用程序同时使用,并且在磁盘上也仅保存一份。另一个好处就是共享库的更新可以独立于它的应用程序。

(特点:动态库在链接阶段并没有被加载到程序中,而程序在运行时被系统动态加载到内存中供程序使用。)

创建:

Eg: 有一个源文件  max.c

gcc   -fPIC -shared  -o  libxx.so   max.c

**libxx.so 就是我们生成的共享库。

 

4.静态库和共享库的区别

静态库的可执行文件中包含了库代码的一份完整的代码,因此当它被多次使用时就会有多份相同的没用的拷贝副本出现在内存中,所以比较占内存。

动态库系统只需要载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此会省很多内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值