摘要:总结了静态函数库和动态函数库的含义和用法,通过实例演示了制作静态函数库和动态库的过程。
一、什么是静态库函数和动态库函数
linux当中进行编程的时候,我们会使用很多的函数,例如open,read等等,这些函数一部分由库函数提供,一部分是系统调用。函数库呢,主要分为静态函数库和动态函数库。
静态函数库:静态函数库我们需要的库会被编译到程序当中去,当程序运行起来之后,不在需要外部的库,因为需要的库已经编译到本身当中了。 静态函数库最大的缺点在于空间的浪费,因为如果多个程序都需要调用同一个库,那么它就会每个程序拷贝一份,最后编译出来的程序非常的大。
动态函数库:动态库函数就是不把需要的库编译到程序里,而是在程序运行的时候,再去动态库里面调用。动态链接库的优点在于有时候各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。
打个比方,我们两队工人出去干活,一个队伍叫A假设它是静态方式,一个叫队伍叫B假设它是动态方式,A把出去干活需要的工具每个人都带一份,背在身上,这样就一人带一份工具做事了。B呢?它不,它找了辆卡车,把需要的工具放在卡车里面了,然后出去干活的时候,需要工具了,它就去卡车里面拿,用完再放回去,优缺点也就一目了然了。
在linux下,库函数都是存放在/lib或者usr/lib目录下,其中采用*.so.*方式命名的都是动态链接库,而以*.a命名的都是静态库。
二、制作与使用静态函数库
这里写一个自己的函数做成库的方式,然后在应用程序里面进行这个库的静态编译与调用,具体步骤如下:
1.gcc–c mylib.c –o mylib.o
2.arcqs libmylib.a mylib.o
3.将制作好的libmylib.a拷贝到/usr/lib目录下
4.在编译的时候加上编译选项:-lmylib
下面首先编写fun.c,功能是比较s1和s2字符串中不同的字母并输出,fun.c如下:
<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
/*fun的作用:比较字符串s1和s2中不同的字符并输出*/
void fun(void)
{
intlen1=0;
intlen2=0;
intcount=0;
inti=0;
chars1[20];
chars2[20];
chars3[20];
gets(s1);
gets(s2);
len1=strlen(s1);
len2=strlen(s2);
if(len1<=len2)
{
for(i=0;i<=len2;i++)
{
if(s1[i]!=s2[i])
{
s3[count]=s1[i];
count++;
}
}
}
else
{
for(i=0;i<=len1;i++)
{
if(s2[i]!=s1[i])
{
s3[count]=s1[i];
count++;
}
}
}
for(i=0;i<count;i++)
putchar(s3[i]);
putchar('\n');
}</span>
mylib.c如下:
<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
#include "fun.h"
int main(void)
{
fun();
return0;
}</span>
fun.h如下:
void fun(void);
下面进行编译制作:
# gcc –c fun.c –o funlib.o
# ar cqs libfunlib.a funlib.o
# cp libfunlib.a /usr/lib/
# gcc mylib.c –o mylib
#./mylib
运行结果如下:
三、制作与使用动态函数库
还是使用上面的文件,按照以下步骤:
# gcc –c mylib.c –o mylib
#gcc –shared –fPIC mylib.o –o libmylib.so
#cp libmylib.so /usr/lib/
其中:
fPIC使输出的对象模块是按照可重定位地址方式生成的。
shared是指明产生动态链接库。
步骤和最后运行结果如下:
这篇帖子就总结到这里吧,如有不正确的地方还请指出,大家共同进步!