网站大量收购独家精品文档,联系QQ:2885784924

UNIX系统开发-静态库与动态库的建立.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
UNIX系统开发-静态库和动态库的建立 UNIX系统及各种软件包为开发人员提供了大量的库文件。但一般情况下这些库文件还不能足以满足用户的所有需求。开发人员大多会根据他们自己的开发、研究要求编写出许多函数。对于这些函数,如果都用在命令行中指定源文件的方法同调用它们的的程序链接起来,虽然也是可以的,但也有一些缺点: 对每一个调用了这些函数的程序,在编译时都需要将这些函数的代码分别重新编译,这实际是对计算时间的大量浪费。 一个文件中通常都不止包含有一个函数的定义。使用上述编译方法将使得大量无关函数的代码被拷贝到最终的可执行文件中,无端加大对存储资源的占用量,使运行时装载变慢。 维护上的诸多不便。由于一个源文件供多个程序使用,当由于某个程序的需要面对此源文件进行了某种修改时将引起诸多意想不到的麻烦。等等。 所有这些原因,使得我们想到能否将自己编写的函数也作成库文件供多个程序调用,就如同那些标准的库函数那样。事实上在UNIX系统中提供了这方面的工具。借助于这些工具我们不光是能将函数放到静态库,而且能够将其作成动态库。 下面来看看如何生成静态库。 我们知道静态库也称档案库,在此档案文件中实际上是收集了一系列的目标文件。这些目标文件就是由CC对函数的源代码编译生成的。因此,静态库的生成方法实际上可分成两步: 1.将各函数代码所在地源文件编译成目标文件。例如,对于前面的myfunc.c,可以用如下命令将其编译成目标文件: $ cc -c myfunc.c 当然在有多个源文件时,只需在cc命令行中将其分别列上就可以了。 经此一步我们将能够得到各源文件的目标文件。对上例将得到myfunc.o。 2.将各目标文件收集起来放到一个静态库文件中。这主要借助于ar命令完成,如: $ ar r $HOME/lib/libtest.a myfunc.o ar:creating /home/yxz/libtest.a $ 这里-o $HOME/lib/libtest.a是生成的静态库的全路径名。其中我们假定$HOME/lib目录已经存在。注意对静态库的命名要遵循libx.a的原则,便于以后能够在cc命令行中用-l选项指定之。后面的myfunc.o则是待收集到档案库中的目标文件名。有多个目标文件时只需分别列上即可。 这生成了libtest.a档案库之后,再编译myprog.c时,便可使用下面的办法: $ cc -L $HOME/lib -o myprog myprog.c -ltest 这里-L选项指示链接程序在$HOME/lib目录下去搜索有关的库文件(当然它还会自动搜索标准位置)。下一节我们对此将进行更详细的说明。最后的-ltest选项指示链接程序在libtest.so或libtest.a中取搜索myprog.c中对TestInput()的引用。当然由于我们并没有生成libtest.so文件,故链接程序将只能搜索libtest.a。另外,由于我们在命令行中并未指定-dn选项,故对于缺省的-lc选项,链接程序将搜索libc.so而不是libc.a。 静态链接库的生成虽然比较简单,但此种链接方式也正因为其简单而在某些情况下达不到比较高的效率。同动态链接方式相比,这种链接方式具有如下一些明显的不足: 由于在生成的可执行文件中包含有函数代码的单独拷贝,这些重复的代码会消耗掉大量的磁盘空间。 运行时各进程单独在自己的地址空间中装入它所调用的每一个函数的代码,这样在有多个进程都调用了同一个函数时,内存中将会有此函数代码的多个拷贝,无端地占用比较多的内存。 由于对符号引用的确定是在编译链接时完成的。故以后对函数的定义进行更新的时候,必须重新链接调用这些函数的程序。 在虚拟存储管理方案的基础上,实现的动态链接方式克服了静态链接上述不足,而使整个系统能够获得比较高的效率。因此缺省情况下,链接程序只要有可能就要试图进行动态链接(找库函数的动态版本)。 进行动态链接的核心问题是要生成动态链接库(共享对象)。下面我们介绍如何生成动态链接库,然后讨论建立动态链接库的一些原则。 建立动态链接库并不需要用到其他的工具,借助于cc命令即可完成。此时需在命令行中加上-K PIC和-G这两个选项,如下我们可以建立libtest的动态版本: $ cc -K PIC -G -o $ HOME/lib/libtest.so myfunc.c 这里-o $ HOME/lib/libtest.so指定待生成的动态链接库的全路径名。同静态库一样,动态库的命令应遵循libx.so约定。-G选项指示cc按动态链接库的格式将其各文件的目标代码组织起来。 -K PIC选项是生成动态链接库所必须的。我们已经知道,动态链接时建立在页式虚拟管理方式的基础上的。在这种需存管理方式

文档评论(0)

woai118doc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档