进击吧,linux(二)-Linux静态函数库设计
0赞对于一个应用程序,链接的时候,是可以链接动态库和静态库的。两个的区别也很简单。链接动态库,动态库的代码不会包含到应用程序的代码中去,而使用静态库的话,静态库的代码都是要包含到应用成的代码中去的。
这样,就很明显,使用动态库要要节约代码空间。当操作系统运行应用程序,遇到动态库中的函数时,就会去操作系统的动态函库中把这函数载进内存,在运行。
在linux中,静态库是放在/usr/lib和/lib目录下的。静态库的后缀是.a。
制作静态函数库也很简单,三步:
1、使用gcc –c 将.c代码编译成.o
如 gcc –c mylib.c -o mylib.o
2、使用ar命令将.o打包成.a
如 ar cqs libmylib.a mylib.o
3、将打包的.a复制打牌/usr/lib目录下
如 cp libmylib.a /usr/lib
这样,一个静态函数库就做好了,要注意的是,打包的.a的文件开头一定要是lib。
下面以一个例子说明,制作一个计算缴个人所得税的静态函数库,提供一个函数可供外部使用,输入月收入和不缴税部分的保险金,最后得出应缴多少税。
/********************************************* *文件名:tax.c *创建者:weiqi7777 *创建时间: 2015年6月8日 *程序说明:这是个人税率计算函数库 **********************************************/ #include<stdio.h> /*函数名: tax * 参数: salary - 月收入 insurance - 保险及其他未缴税部分 * 输出: float(应缴税款) * 函数功能: 根据月收入及未需要缴税部分,计算应缴税的税额 ***************************************/ float tax(int salary, int insurance) { int tax_salary = salary - insurance; int temp = tax_salary - 3500; if(temp < 0) { printf("you don't need to tax!\n"); return 0; } else if(temp <= 1500) return (temp * 0.03 - 0); else if(temp <= 4500) return (temp * 0.1 - 105); else if(temp <= 9000) return (temp * 0.2 - 555); else if(temp <= 35000) return (temp * 0.25 - 1005); else if(temp <= 55555) return (temp * 0.3 - 2755); else if(temp <= 80000) return (temp * 0.35 - 5505); else return (temp * 0.45 - 13505); }
然后按照上面说的3步,制作静态链接库。
以上,就做好了静态链接库,libmytax.a
下面就要写程序来使用。
#include <stdio.h> #include "tax.h" void main() { float my_tax = 0; my_tax = tax(9500,1200); printf("I need tax %f\n",my_tax); }
这里,有加一个头文件tax.h。这个头文件就是声明tax.c代码的函数。
float tax(int salary, int insurance);
然后编译程序。Linux默认是使用动态函数库链接的,所以要加一个编译选择-static,告诉编译器使用静态函数库链接。
命令是 gcc –static *.c –lname –o 输出
-l是指定链接的静态函数库,name是函数库的名字,因为静态函数的开头都是lib开头的,所以lib不用写,写后面部分的名字即可。
这样,写的程序就用我们预先设计的静态函数库编译链接了。
运行
以上,就是静态函数库的设计了。