静态链接函数库和动态链接函数库

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   //查看运行的动态链接函数库

 

posted @ 2019-03-11 17:08  dongry  阅读(840)  评论(0编辑  收藏  举报