第三季-第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使用静态库—编译选项
- linux下进行链接时,默认的是链接动态库。
- 如果需要使用静态库,需要使用编译选项-static
例如:gcc -static test.c -o test
在我们使用的redhat6版本中,是没有使用静态链接库的,我们只需要把课程提供给我们的安装包安装好了即可。
安装后,我们会在/usr/lib/目录下看到libc.a文件,我们也会发现使用静态链接库的程序是比使用动态链接的程序的大的。
6.6制作静态库
- gcc -c mylib.c -o mylib.o
- ar cqs libmylib.a mylib.o
- 将制作好的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\n",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!\n");
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
第三季-第6课-静态函数库设计相关推荐
- App Inventor 2 题库设计制作流程
题库设计制作流程 本文为图片介绍,没有过多文字注释. App Inventor 界面制作 UI设计题目部分 UI设计选择部分 UI部件介绍 逻辑部分(不用文字描述了,看图) 初始化部分: 这是题库:( ...
- php比特教务选排课系统的设计与实现毕业设计源码301826
比特教务选排课系统的设计与实现 摘 要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个B/S结构的比特教务 ...
- php比特教务选排课系统的设计与实现 毕业设计-附源码301826
比特教务选排课系统的设计与实现 摘要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个B/S结构的比特教务选 ...
- ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计
ylbtech-DatabaseDesgin:ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计 -- DatabaseName:通用表结构 -- -- 主要是针对将要设计的表对象 ...
- 新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...
  [导读]:2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材),更多新疆等级考试易考套餐,请访问易考吧新疆等级考试栏 ...
- golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法
golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...
- 5阶魔方阵c语言程序设计,五阶魔方阵源代码c语言课到程设计.docx
五阶魔方阵源代码c语言课到程设计 主函数 #include #include #include # include "wenjian.c" # include "sanj ...
- DOS中使用扩展内存与XMS操作库设计
DOS中使用扩展内存与XMS操作库设计 作者:彭学周(Favory.Peng) DOS系统常规内存指的是0-640K的内存区.在DOS下,一般的应用程序只能使用系统的常规内存,因而都要受到640KB内 ...
- 高中英语话题阅读 计算机,高中英语必修二Unit 3 Computers阅读课的教学设计
高中英语必修二unit 3 computers阅读课的教学设计 一.教学设计思路 本课设计以who am i?为课堂教学材料,以学生现实生活为出发点和归宿点,以我国<标准>指导教学目标制定 ...
- 静态库,动态库是啥,有啥区别(静态函数库/动态函数库)
因之前初学接触这个概念的时候无法直观的理解,询问多人也得到类似如下回复:静态库就是静态库,动态库就是动态库.一个编译一个不编译等类似的回复.伪善的人太多,披着"有问题可以问我"的外 ...
最新文章
- 任意角度人脸检测pcn
- Python实现PS滤镜Fish lens图像扭曲效果示例
- leetcode127. 单词接龙(bfs)
- M理论能否成为解释一切的“万有理论”?
- Give root password for maintenance(or type control -D to continue)
- MySQL(八)事务的隔离级别
- 在PB中使用WINSOCK.OCX做双向通信的简单例子
- 苹果MacBook常用快捷键 复制 粘贴 截屏 录屏快捷键
- HDU 5336 BFS
- Google鲜为人知的强大功能!(陆续更新)
- 论war3中的随机数系统
- Kafka入门经典教程
- Java程序员的职业规划(五年)
- RF 电路设计中的常见问题及解决方案
- 最新 RibbonCreator 2021 OFFICE功能区编辑器
- rails 杂记 - erb 中的 link_to 的 ActiveRecord 与 render 中的 partial
- 静态代码分析工具清单:开源篇(各语言)
- “今天,我们回家”-激动中,水木又回来了!
- 网站攻击软件_公安某局DDoS攻击软件检验案例
- Zuul2 的 线程模型
热门文章
- 实习踩坑之路:快速失败:使用stream流便利集合的时候删除了对象,导致抛错Null
- Redis客户端Redisson+SpringBoot实现的分布式锁案例
- 2019必学的10大顶级Python库!
- C++11中移动语义(std::move)和完美转发(std::forward)
- FFmpeg总结(十一)用ffmpeg进行转格式,Android下播放网络音频流
- 周五,放松心情,听我来分享问题背后的背后(一)
- 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
- 数据字典模块设计_使用正则表达式采集整站小说数据小说精品屋爬虫模块的设计与实现...
- 层次聚类 簇数_聚类(一):K-means、层次、DBSCAN、均值漂移、K-Means 与 KNN
- cdh用户权限_CDH6.3.2之Sentry权限管理(三)