6.静态函数库设计

程序设计中,离不开函数的使用。Linux应用程序设计中需要外部函数。主要是由函数库和系统调用来提供。

?

两者区别:

系统调用的是在Linux内核里的,函数库是在用户空间的。

函数库分类:

????函数库按照链接方式可分为:静态链接库和动态链接库。

?

Linux应用程序使用的这些函数库主要存在于/lib目录和/usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命名的是静态函数库。

/lib:

/usr/lib:

静态链接库的特点:

程序所用到的库函数代码在链接时全被copy到程序中。导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那就会有多份拷贝,这就是对空间的浪费。如下图:

?

编译选项:

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

例子:gcc –static exm.c –o exm

下面看一个我们经常编译c文件的过程。在下面看到该程序用到*.so.*动态库。

生成的文件的大小:

加上-static参数后,编译出错:

这是因为redhat 6.4之后的版本不提供该功能了。我们需要安装该库:

glibc-static-2.12-1.80.el6.i686.rpm

ll看静态编译生成的文件比较大:

?

制作静态库:

使用自己制作静态库:

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

例子:gcc hello.c –lmylib –o hello.

注意:静态链接库的命名:

????Libmylib.a:其中lib是必须加的,就是静态链接库的名字为libmylib.a在引用的时候是-lmylib。

????动态链接库的命名,跟静态一样只是后缀为.so。

?

实例:

?

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

> File Name: mylib.c

> Author: FORFISH

> Mail: [email protected]

> Created Time: Fri 16 Jan 2015 07:44:10 AM EST

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

#include <stdio.h>

int tax(int salary, int insurance){

????int tax_salary = salary - insurance;

????int temp = tax_salary -3500;

????if(temp<0){

????????printf("your salary is too low to hand on tax!\n");

????????return 0;

????}

????if(temp<=1500){

????????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;

????}

????else{

????????return temp*0.45-13505;

????}

}

打包生成库:

把生成的库libmylib.a拷贝到/usr/lib目录:

编写应用程序使用我们创建的静态链接库:

首先是创建一个c文件mytest.c:

#include <stdio.h>

#include "tax.h"

void main(){

????int my_tax =0;

????my_tax = tax(9500,1200);

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

}

头文件tax.h的代码:

int tax(int salary, int insurance);

编译运行如下:

?

?

?

?

?

时间: 2024-10-26 22:29:29

6.静态函数库设计的相关文章

[国嵌攻略][073][静态函数库设计]

外部函数 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别 系统调用在Linux内核中位于核心态,而函数库是由工程师提供位于用户态 函数库分类 函数库按照链接方式可以分为静态函数库和动态函数库 存放位置 Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中以*.so.*方式命名的是动态函数库,而以*.a方式命名的是静态函数库. 静态链接库的特点 程序所要用到的库函数代码在链接时全部被拷贝到程序中.如果有多个进程在内存中同时运行,并且使用了

8、静态函数库设计

函数库分类函数库按照链接方式可分为 1.静态链接库 2.动态链接库 函数库 -存放位置 Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库. 静态链接库-特点1.程序所要用到的库函数代码在链接时全部被copy到程序中.2.导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费. 使用静态库-编译选项 1.Linux下进行链接时 默认是链接动态

第6课-函数库设计

1.Linux下的应用程序所需要的外部函数可以由函数可和系统调用提供.2.函数库是处于用户态的,由工作人员编写的函数的集合,而系统调用是由Linux内核实现的.3.函数库分为静态和动态,按照链接方式划分的.动态函数库比静态节约空间.使用静态函数库以后应用程序最终会包含自身和函数库,在内存中运行的时候就会有多个函数可的拷贝,导致在空间上的浪费.而动态函数库则在内存中只有一个拷贝,供多个都会使用到的程序使用.4.Linux使用的函数库一般都是在/lib或者在/usr/lib,以*.so*命名的,是动

C语言的动态函数库和静态函数库的生成和使用(linux环境下)

软件开发往往是一个十分庞大的工程.需要消耗大量的脑力.借助别人已经开发好的库,往往能提高效率,下面将介绍如何开发和使用共享的库文件.使用别人已经开发好的库,就像是我们想要建造一辆汽车十分困难,但是如果汽车的各大部件都已经存在并且可以获得,我们要做的工作就是组装,组装过程一定比设计这些部件要轻松. 函数库分为两种静态(static)函数库和动态(shared)函数库.两者都是函数的集合.区别:在编译的时候会把静态函数库的内容加到目标程序中,目标程序具有函数库的代码;而动态函数库是在执行的时候才把函

淘宝IP地址库设计

当初选择做这么一个项目,不是为了拷贝一份库自己做服务,也不是为了其他目的,只是单纯的熟悉关于http和mysql方面的知识. 下面言归正传. 1.淘宝IP地址库简介 此地址库可以根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 用户也可以主动提交信息来纠错. 主要优势表现为: (1)地域 覆盖度:94.54% 精确到市级 准确度:96.5% 精确到市级 (2)运营商 覆盖度:93.8% 准确度:暂无统计数据 (3)查询速度 10qps 注:阿

静态函数库的制作和使用

C语言的函数库是多组经过验证的常用函数的集合,编写C语言程序时使用库函数,既可以提高程序运行效率,又可以提高编程质量,使用方法如#include 和#include. 根据使用库函数时,函数库加载时机的差异,将函数库分为静态函数库和动态函数库,具体差异是:C语言程序如果使用静态函数库的函数,那么整个函数库的代码都会和C语言程序一起编译成可执行代码,程序的体积会膨胀:如果使用动态函数库的函数,则C语言程序只会和函数库文件名以及函数名一起编译成可执行代码(不编译函数代码),运行时去查找函数库文件和函

golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: unsupported Scan, storing driver.Value type <nil> 解决方案就是动态的把数据 字段前加一上一个COALESCE SELECT u.id,ta.`title` as `活动名` ,COALESCE(IFNULL(i.name,i.nickname) F

静态函数库和动态函数库

静态函数库是在编译链接时,把库文件代码全部加入到可执行文件中,因此生成的文件比较大,而运行时也就不需要库文件了.Linux中静态函数库的后缀名一般为".a",windows中为".Lib": 动态函数库是在编译链接时没有把库文件代码加入到可执行文件中,而是将要调用的函数所在文件的和该函数在文件中的位置等信息链接进目标程序.Linux中动态函数库的后缀名一般为".so",windows中为".dll".

Linux中的动态函数库和静态函数库的比较

库函数既提高了代码的利用率,又屏蔽了函数内部实现的细节,给不同开发者提供了统一的接口.从实现来看,库函数可以分为动态函数库和静态函数库.同一组函数,可以根据需要封装成静态库和动态库.那么生成静态库和动态库有什么区别?静态库和动态库对函数的实现上各有些什么要求?两者对内存各有什么影响呢?下面就带着这些问题一起开探讨. 静态库和动态库生成方式的区别为了简化,下面以一个只有一个函数的库的实现来说明.库函数的代码demo.c如下:/************************************