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按动态链接库的格式将其各文件的目标代码组织起来。

时间: 2024-09-21 13:27:48

UNIX系统管理:静态库及动态库的建立的相关文章

关于Linux静态库和动态库的分析

原文:http://linux.chinaunix.net/techdoc/net/2009/02/04/1060670.shtml 1.什么是库 在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库.2.库的种类linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同.静态库的代码在编译

C++静态库与动态库

C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养--链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib

静态库和动态库的区别以及使用

问题描述 静态库和动态库的区别以及使用 什么是动态链接库和静态链接库?它们有什么区别?它们分别如何使用? 解决方案 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.? 静态库和动态库的区别 静态函数库 ??? 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的....

Linux静态库和动态库的编写和使用

Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.   1  静态库和动态库的区别 1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a (2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译. 1.2. 动态

平台-关于windows下创建静态库和动态库的问题

问题描述 关于windows下创建静态库和动态库的问题 windows下的库是跨平台的吗,比如我用qt写了个动态库,可以再其他平台用吗 解决方案 Qt是跨平台的,可以在其他平台下使用. 解决方案二: 当然不是,dll只能在windows上用.但是不排除别的操作系统可以通过自身的模拟去兼容.linux下的wine连windows下的exe都能兼容. qt是跨平台的库,但是并不是二进制文件跨平台,而是相同的源代码用不同的编译器/链接器编译,实现的跨平台. 解决方案三: winfdows上的动态库,静

Linux静态库和动态库的分析及实现

1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 2.库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体

Linux 中的静态库和动态库简介及生成过程示例

在实际的软件开发项目中,不是每一行代码都需要我们亲自写.在我们的软件产品中,有一些代码(尤其是函数)的出现频率很高,它们可以被当作公共代码来反复使用.为了避免重复劳动,我们就把这些公共代码编译为库文件,供需要的程序调用.在Linux中,库分为静态库和动态库两种. 本文对静态库和动态库进行了详细的介绍,并用实际的C代码演示了这两种库的生成过程. 一.静态库和动态库简介 众所周知,程序一般需要经过预处理.编译.汇编和链接这几个步骤才能变成可执行的程序.在实际的软件开发中,对于一些需要被许多模块反复使

Linux中的静态库和动态库简介及生成过程示例

[文章摘要] 在实际的软件开发项目中,不是每一行代码都需要我们亲自写.在我们的软件产品中,有一些代码(尤其是函数)的出现频率很高,它们可以被当作公共代码来反复使用.为了避免重复劳动,我们就把这些公共代码编译为库文件,供需要的程序调用.在Linux中,库分为静态库和动态库两种. 本文对静态库和动态库进行了详细的介绍,并用实际的C代码演示了这两种库的生成过程. 一.静态库和动态库简介 众所周知,程序一般需要经过预处理.编译.汇编和链接这几个步骤才能变成可执行的程序.在实际的软件开发中,对于一些需要被

深入探讨Linux静态库与动态库的详解(一看就懂)_C 语言

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译.2. 动态函数库这类库的名字一般是libxxx.so;相对于静态

静态链接库和动态库的引入库lib文件的区别 .

在VC编程中常常碰到的.lib文件有一个需要注意的地方是:   静态库--函数和数据被编译进一个二进制文件(扩展名问.lib).在使用静态库的情况下,在编译连接可执行文件时,连接器从库中复制这些函数和数据并把他们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)文件,当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库.   动态库--在使用动态库时,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件.虽然引入库的后缀名也是".lib",但