第三季-第6课-静态函数库设计

第6课-静态函数库设计

6.1 外部函数

程序设计中,离不开函数的使用。Linux应用程序设计需要的外部函数是由谁来提供的呢?

Linux应用程序设计中需要的外部函数主要要由函数库和系统调用来提供。但是这两种方法也是有区别的。其中系统调用是由linux内核来完成(如open),函数库则是用户态的。

6.2 库的区分和对比

根据链接方式y 的不同我们可以把函数库分为静态库和动态库。

对于静态函数库的使用,当有多个文件都要调用它时,它分别复制给每一个程序,完成相应的使用。

对于动态函数库的使用,再有多个程序对它进行调用的时候,我们不是将函数库分别复制到每一个程序中。它们独立存在,当运行到程序中需要对应的函数库时,就将函数库导入到内存中。而且导入一次可以多次重复使用(在运行期完成)。

6.3 函数库-存放位置

Linux应用程序使用的函数库均存放在/lib,/usr/lib目录下,其中采用*.so.*(如lib.so.1)方式命名的是动态函数库,而以*.a方式命名的是动态函数库。

6.4 静态函数库的特点

1.程序所要用的函数代码在链接时全部被copy到程序中。

2.导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的函数库,那么就会有多分拷贝,这就是对空间的浪费。

6.5使用静态库—编译选项

  1. linux下进行链接时,默认的是链接动态库。
  2. 如果需要使用静态库,需要使用编译选项-static

例如:gcc -static test.c -o test

在我们使用的redhat6版本中,是没有使用静态链接库的,我们只需要把课程提供给我们的安装包安装好了即可。

 

安装后,我们会在/usr/lib/目录下看到libc.a文件,我们也会发现使用静态链接库的程序是比使用动态链接的程序的大的。

6.6制作静态库

  1. gcc -c mylib.c -o mylib.o
  2. ar cqs libmylib.a mylib.o
  3. 将制作好的libmylib.a复制到/usr/lib

6.7 编译选项

-lname:GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则是需要使用-l选项来显示地指明需要链接。

例:gcc test.c -lmylib -o test   //使用名字为mylib的函数库

注意:一般地我们把库的命名都是要加lib开头的,如:libmylib.a和libmylib.so。在使用-l选项的时候,我们通常又不用在库的名字面前加lib。

下面介绍操作实例:

在操作中,我们建立了相应的tax.c文件,用来将算法程序化。我们将它通过命令:gcc -c tax.c -o tax将它变成tax.o文件。我们再将tax.o文件打包成libtax.a静态库,这里我们用到的命令是:ar cqs libtax.a tax.o。通过命令cp libtax.a /usr/lib将它复制到指定的目录。

建立问价mytax.c用来测试静态库的正确性。为了调用我们的函数,还要编写头文件函数tax.h。

最后根据命令gcc -static mytax.c -ltax -o mytax生成mytax文件。这里在实际的运行中,出了问题,原因在于/usr/bin/ld文件中缺少相应的库,为了操作方便,我们直接使用命令gcc  mytax.c -ltax -o mytax生成的mytax.o文件,同样是我们预期得到的。

mytax.c

#include<stdio.h>

#include"tax.h"

void main()

{

         int my_tax = 0;

         my_tax = tax(9500,1200);

         printf("I need to tax %d ",my_tax);

}

tax.c

/***********************************

*文件名:tax.c

*创建时间:2018-5-8

*创建者:段立勇

*程序说明:个人税率计算函数库

****************************/

#include<stdio.h>

int tax(int salary,int insurance)

{

         int tax_salary =salary-insurance;

         int tmp = tax_salary - 3500;

         if(tmp<0)

         {

                   printf("you don't need to tax! ");

                   return 0;

         }

         if(tmp<=1500)

                   return tmp*0.03-0;

         if((tmp>1500)&&(tmp<=4500))

                   return tmp*0.1-105;

         if((tmp>4500)&&(tmp<=90000))

             return tmp*0.2-555;

         if((tmp>90000)&&(tmp<=35000))

                   return tmp*0.25-1005;

         if((tmp>35000)&&(tmp<=55000))

                   return tmp*0.3-2755;

         if((tmp>55000)&&(tmp<=80000))

                   return tmp*0.35-5505;

         if(tmp>80000)

                   return tmp*0.45-13505;

}

tax.h

int tax(int salary,int insurance);

下面给出解决问题的链接;
https://blog.csdn.net/mzwang123/article/details/6702889

原文地址:https://www.cnblogs.com/free-1122/p/11342099.html