说到库,先来简单的说一下库的使用。
其实,程序的实现主要工作之一就是函数的实现嘛,这个学习计算机语言的筒子都知道,但是有一些非常基本,常用的函数比如打印信息(printf),文件的打开关闭函数(fopen,fclose),计算函数等等,这些函数都是编程系统集中到库中实现的。这是为了降低编程的工作量,有效提高编程的效率,另外,由于这些函数库往往是由一些资深的程序员编写的,具有出色的运行性能和工作效率,所以也能提高程序的健壮性。
简单的介绍了函数库,那么函数库其实又分为两种:
1、静态链接库。
静态链接是指编译系统在链接阶段把程序的目标文件和所需的函数库文件链接在一起,这样生成的可执行文件就可以在没有函数库的情况下运行;
下面以一个简单的打印整形数组的函数为例:
第一步:建立一个头文件array.h声明该功能函数:
第二步:建立一个函数array.c实现该功能:
第三步:使用gcc -c array.c 将功能函数编译为目标文件。
第四步:使用ar -rc libarray.a array.o 建立静态函数库。生成libarray.a文件,然后将其复制到/usr/lib目录下。
其中,r是replace的意思,是指在库中替换(插入)模块;
c是create的意思,是指创建一个库文件,不管是否存在。
第五步:建立文件test.c测试静态函数库:
好了,简单的静态库制作完成!
2、动态链接库。
动态链接是指编译系统在链接阶段不需要把目标文件与函数库文件链接在一起,而是等到程序在运行过程中需要使用时才链接函数库;
同样以一个简单的例子来演示:
前三步基本相同,我修改了一下源代码:
array.h
array.c
接下来第四步:使用gcc -fPIC -shared -o libarray.so array.o生成libarray.so动态库,然后将其复制到/usr/lib目录下面。
然后建立测试文件test.c 编译运行进行测试:
至此,简单的动态库也制作完成了!
总结:1、静态库和动态库都是对目标文件操作,也就是说库文件已经是机器码文件了。
2、静态库是编译系统在链接阶段把程序的目标文件和所需要的函数库文件链接在一起,优点是可以在不需要函数库的情况下运行,节省了时间,运行效率较高;缺点是生成的可执行文件体积较大,占用磁盘和内存空间。所以应该在只有少数源文件需要调用函数库的时候使用静态链接的方式。所以是牺牲空间效率换时间效率。
3、动态库是编译系统在链接阶段不把目标文件和函数库链接在一起,而是只给可执行程序一个函数引用表,当程序运行过程中需要使用库函数时才链接函数库,将函数拷贝到程序中。优点是占用的磁盘和内存空间较少;缺点是由于链接需要耗费一定的时间,所以运行效率不如静态库。所以是牺牲时间效率换空间效率!
另外,可以使用ldd命令查看一个可执行程序所依赖的函数库!