weiqi7777

进击吧,linux(二)-Linux静态函数库设计

0
阅读(1975)

       对于一个应用程序,链接的时候,是可以链接动态库和静态库的。两个的区别也很简单。链接动态库,动态库的代码不会包含到应用程序的代码中去,而使用静态库的话,静态库的代码都是要包含到应用成的代码中去的。

       这样,就很明显,使用动态库要要节约代码空间。当操作系统运行应用程序,遇到动态库中的函数时,就会去操作系统的动态函库中把这函数载进内存,在运行。

       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步,制作静态链接库。

clip_image002

以上,就做好了静态链接库,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不用写,写后面部分的名字即可。

clip_image004

这样,写的程序就用我们预先设计的静态函数库编译链接了。

运行

clip_image006 

以上,就是静态函数库的设计了。