Linux应用设计中使用的外部函数主要来源于函数库调用和系统调用。系统调用由Linux内核实现,即函数的实现代码包含在内核里,如open函数;函数库位于内核之外,是语言或应用程序的一部分,如c库,程序员自己开发的函数库。
函数库按照链接方式可以分为静态链接库和动态链接库。
Linux应用程序使用的主要函数库均存放于
/lib, /usr/lib目录下,其中采用*.so.*方式
命名的是动态函数库,而以*.a方式命令的是
静态函数库。
使用静态链接库时,程序所要使用的库函数的代码在链接时全部被拷贝到程序中。如果有多个程序在内存中运行,并且使用了相同的库函数,那么在内存中就会有多份拷贝,造成空间的浪费。
Linux编译时默认是链接动态库,如果要使用静态库则需要使用编译选项-static,如:
gcc -static test.c -o test
制作静态链接库的步骤为:
①gcc -c mylib.c -o mylib.o #只编译,不链接
②ar cqs libmylib.a mylib.o #打包生成函数库
③cp libmylib.a /usr/lib/libmylib.a #将制作好的libmylib.a复制到/usr/lib
如下面的tax.c实现计算个人所得税:
/****************************************************
* 文件名:tax.c
* 程序说明:计算个人所得税
* 公式:个人所得税=(收入-三险一金-个税免征额3500)*适用税率-速算扣除数
****************************************************/
int tax(int salary,int insurance)
{
int my_salary=salary-insurance;
int tmp=my_salary-3500;
if(tmp<=0)
return 0;
if(tmp<=1500)
return tmp*0.03;
if(tmp<=4500)
return tmp*0.1-105;
if(tmp<=9000)
return tmp*0.2-555;
if(tmp<=35000)
return tmp*0.25-1005;
if(tmp<=55000)
return tmp*0.3-2755;
if(tmp<=80000)
return tmp*0.35-5505;
if(tmp>80000)
return tmp*0.45-13505;
}
以下为一个使用tax函数库的test.c:
#include<stdio.h>
#include"tax.h"
void main()
{
int my_salary=8000;
int my_insurance=1200;
int my_tax=tax(my_salary,my_insurance);
printf("the tax is %d\n",my_tax);
}
这里的tax.h需要自己创建,里面内容为声明函数
int tax(int salary,int insurance)。
编译:gcc -static test.c -ltax -o test
说明:GCC在链接时,默认只会链接C函数库,而对于其他函数库,则需要使用-l选项来显示地指明需要链接,形式为-lname.函数库默认以lib开头,程序员制作自己的函数库时也应该遵循这一规则,如libmylib.a,libmylib.so,而用-l选项指明函数库不写上lib以及后缀,只写-lmylib。有些Linux版本不带静态c库,如果需要静态链接还需要安装静态c库。