CSAPP第七次讨论课选题四:静态库和动态库

一、题目描述

选题四:
  在 Linux 里用 C 语言进行代码设计,能对一个班级、某一门课程、或者某一名学生的分数进行分析,比如分数段、最高分、最低分、排名、优势课程等,具体涉及分析内容尽量丰富,请各位同学根据个人对学校系统实际体验来完成。请将这些功能根据在第 7 章的学习,在 linux 下分别编译成相应的静态库和共享库(动态库);并在组内或组间进行库调用以评测所设计的库;从库的调用者角度,比较分析静态库和共享库对最终可执行文件的影响。

二、静态库和动态库

  linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。库是别人写好的现有的,成熟的,可以复用的代码,可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

三、结合题目进行相关函数设计

  结合题目进行如下代码设计:从班级、课程和学生角度设计函数。从班级和课程角度:函数score_scale用于对班级和各科的成绩进行分数段统计,函数high_low用于统计班里最高分和最低分、各科最高分和最低分。如下图:
在这里插入图片描述
  从学生角度:函数rankings用于计算输入学号为i的学生班级总成绩排名、各科成绩排名,函数advantage用于计算该学生的优势科目。如下图:
在这里插入图片描述
  在main函数中调用了库analysis.a中的函数,在analysis.h声明这些函数,在prog.c中调用这些函数。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、编译静态库和动态库

(1)静态库:
  生成的文件:
在这里插入图片描述
  创建、编译、链接静态库:
在这里插入图片描述
静态库的后缀是.a,它的产生分两步
  Step 1.由源文件编译生成一堆.o文件,每个.o里都包含这个编译单元的符号表
  Step 2.ar命令将很多.o文件转换成.a,静态库在linux下,库文件一般放在/usr/lib /lib下
静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称,这里设计的静态库是analysis.a。
  在生成了可执行文件test1后进行功能测试:能够正确满足题目所要求的所有功能。测试如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)动态库:
  各个文件如同静态库示例,现给出共享库的创建:
  step1 : gcc -shared –fPIC –o libxxxx.so 文件1.c 文件2.c ……
将其链接到程序中:
  step2 : gcc -o p2 main2.c ./libxxxx.so
  测试相关功能均正确。
在这里插入图片描述
  可用ldd命令可以查看一个可执行程序依赖的共享库(如下图)
在这里插入图片描述

  可以看见可执行目标文件test2用了库analysis.so(自己设计的)和系统默认的库中的函数。
  有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。这里可看到本题我们设计的函数advantage、high_low、rankings、score_scale。
在这里插入图片描述

五、静态库和共享库对最终可执行文件的影响

  当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。这就会导致最终生成的可执行代码量相对变多,相当于编译器将代码补充完整了,这样运行起来相对就快些。不过会有个缺点:占用磁盘和内存空间。静态库会被添加到和它连接的每个程序中,而且这些程序运行时,都会被加载到内存中。无形中又多消耗了更多的内存空间。
  与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时,那些需要的函数代码才被拷贝到内存中。这样就使可执行文件比较小,节省磁盘空间,更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用,也同时节约了内存。不过由于运行时要去链接库会花费一定的时间,执行速度相对会慢一些。

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值