静态链接函数库和动态链接函数库
Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供;
函数库按照连接方式可以分为静态链接函数库和动态链接函数库
1 静态函数链接库和动态函数链接库的区别
静态函数链接库:M、N函数在内存中运行的时候,对应static libraries对应库函数中的函数由两个拷贝;
静态链接库程序所要用的函数代码在链接时全部被copy到程序中;如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就会造成对空间的浪费。
动态函数链接库:M运行到某一行代码发现要调用Dynamic Libraries库中的函数,系统会将库函数中的函数导入到内存当中,当N调用的时候发现内存中已经有该函数了,就不会重复导入,内存中就只有一份拷贝。
静态链接是程序本身跟库链接到一起,动态链接是程序本身;
2 函数库存放位置
Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中采用*.so方式命名的是动态函数,采用*.a方式命名的是静态函数。
3 函数库的制作
/************************************* *file name:tax.c *data:2019-03-11 *name:dongry *destiry:personal tax function library ***************************************/ int tax(int salary,int insurance) { int taxsalary = salary- insurance; int temp=taxsalary-3500; if(temp<=0) return 0; if(temp<=1500 && temp>0) return (temp*0.03-0); if(temp>1500 && temp<=4500) return (temp*0.1-105); if(temp>4500 && temp<=9000) return (temp*0.2-555); if(temp>9000 && temp<=35000) return (temp*0.25-1005); if(temp>35000 && temp<=55000) return (temp*0.3-2755); if(temp>55000 && temp<=80000) return (temp*0.35-5505); if(temp>80000) return (temp*0.45-13505); }
/************************************************ *filename:mytax.c *data:2019-3-11 *name:dongry *****************************************/ #include <stdio.h> #include "tax.h" int main() { int my_tax=0; my_tax = tax(19500,1200); printf("i need tax %d\n",my_tax); }
/********************************************* *file name:tax.h *data:2019-03-11 *name:dongry *************************************************/ int tax(int salary,int insurance);
3.1 静态库函数制作
生成tax.o文件
gcc -c tax.c //生成了tax.o文件
生成静态库libtax.a
ar cqs libtax.a tax.o //制作完成静态的libtax.a
将libtax.a复制到/usr/lib/文件夹中
cp libtax.a /usr/lib/
编译生成二进制文件mytax:
gcc -static mytax.c -ltax -o mytax
./mytax //运行mytax
注:l:GCC只会默认C函数库,对于其他的函数库,则需要使用-l选项指明所以链接的库。
3.2 动态库函数制作
生成tax.o文件
gcc -c tax.c //生成了tax.o文件
生成动态库libtax.so
gcc -shared -fPIC tax.o -o libtax.so //制作完成静态的libtax.so
将libtax.a复制到/usr/lib/文件夹中
cp libtax.so /usr/lib/
编译生成二进制文件mytax:
gcc mytax.c -ltax -o mytax
./mytax //运行mytax
注:l:GCC只会默认C函数库,对于其他的函数库,则需要使用-l选项指明所以链接的库。
readelf -d mytax //查看运行的动态链接函数库