静态库 共享库 动态链接 静态链接
库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(curses库)等
标准的系统库文件一般保存在/lib或者/usr/lib子目录里。编译时要告诉 C语言编译器(更确切地说是链接程序)应去查找哪些库文件。默认情况下,它只会查找 C语言的标准库文件。这是从计算机速度还很慢、CPU价格还很昂贵的年代遗留下来的问题。在当时,把一个库文件放到标准化子目录里然后寄希望于编译器自己找到它是不实际的。库文件必须遵守一定的命名规则,还必须在命令行上明确地给出来。
库文件的名字永远以lib这几个字母打头,随后是说明函数库情况的部分(比如用c表示这是一个 C语言库;而m表示这是一个数学运算库等)。文件名的最后部分以一个句点(.)开始,然后给出这个库文件的类型,如下所示:
● .a 传统的静态型函数库。
● .so和. sa 共享型函数库(见下面的解释)。
函数库一般分为静态和共享两种格式,用ls /usr/lib命令查一下就能看到。在通知编译器查找某个库文件的时候,既可以给出其完整的路径名,也可以使用–l标志。
1. 静态库
函数库最简单的形式就是一组处于可以“拿来就用”状态下的二进制目标代码文件。当有程序需要用到函数库中的某个函数时,就会通过 include语句引用对此函数做出声明的头文件。编译器和链接程序负责把程序代码和库函数结合在一起成为一个独立的可执行程序。如果使用的不是标准的C语言运行库而是某个扩展库,就必须用–l选项指定它。
静态库也叫做档案(archive),它们的文件名按惯例都以. a结尾。比如 C语言标准库为/usr/lib/libc.a、X11库为/usr/X11R6/lib/libX11.a等。
自己建立和维护静态库的工作并不困难,用ar(“建立档案”的意思)程序就可以做到,另外要注意的是,应该用gcc -c命令对函数分别进行编译。应该尽量把函数分别保存到不同的源代码文件里去。如果函数需要存取普通数据,可以把它们放到同一个源代码文件里并使用在其中声明为static类型的变量。
2. 共享库
静态库的缺点是,如果我们在同一时间运行多个程序而它们又都使用着来自同一个函数库里的函数时,内存里就会有许多份同一函数的备份,在程序文件本身也有许多份同样的备份。这会消耗大量宝贵的内存和硬盘空间。
许多UNIX系统支持共享库,它同时克服了在这两方面的无谓消耗。
共享库的存放位置和静态库是一样的,但有着不同的文件后缀。在一个典型的 Linux系统上,C语言标准库的共享版本是 /usr/lib/libc.so N,其中的N是主版本号。
3. 动态链接和静态链接
在编译Linux程序时,我们经常会看到动态链接和静态链接这两个术语。
这两个术语中是Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余, 程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamically Linked)。但有时为了程序调试方便或其它原因,我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本 身拥有一份共享函数库中函数的副本。这种方式我们称之为静态链接(Statically Linked)。