2006-02-19

静态和动态链接库

Views: 13891 | 5 Comments

创建和使用“C”的静态和共享链接库Building And Using Static And Shared "C" Libraries

 开发程序的其中一个问题是,它们总是倾向于变得越来越大,使得编绎和链接的时间是一个大数字,而且破坏了makefile,和源文件所在的目录。一旦我们的程序达到这种状况,那么该是我们寻找一种不同的方法来管理我们的项目的时候了。

正因为如此,我们想到将相关联的源码文件结合成小的单元,使得可以使用单独的makefile来管理,由不同的程序员来管理也是可以的(在多程序员的项目上)。

什么是“C”链接库?它有什么好处?What Is A "C" Library? What Is It Good For?

编绎器给我们的一个工具是链接库。一个链接库就是一个包含多个目标文件的文件,在一个程序的链接阶段可以作为一个单独的整体来使用。链接库一般是索引好的,所以很容易找到它们的符号(函数,变量等等)。因为这个原因,当一个程序的目标文件被安排在链接库时,其链接的速度比目标文件分布在磁盘上更快。而且,使用链接库的时候,我们只查找和打开更少的文件,这加快了链接的速度。

Unix系统(以及大部分的现代系统)允许我们创建和使用两种链接库 -- 动态链接库和共享(或者说静态)链接库。(这里可能是原文或者原来翻译时的笔误. 本人有理解翻译内容的责任.) Unix系统(以及大部分的现代系统)允许我们创建和使用两种链接库 -- 静态链接库和共享(或者说动态)链接库.

Static libraries are just collections of object files that are linked into the program during the linking phase of compilation, and are not relevant during runtime. This last comment seems obvious, as we already know that object files are also used only during the linking phase, and are not required during runtime - only the program's executable file is needed in order to run the program. 静态链接库只是目标文件的集合,这些目标文件在链接阶段被链接进程序之中,在程序运行的时候没有关系。最后一个观点看起来是很显然的,因为我们已经知道目标文件只是在链接阶段被使用,程序运行的时候并不需要 -- 只有程序的可执行文件运行的时候需要它。(我没有理解这一段话的意思。看起来作者也应该不知道自己在讲什么。不过,我知道,静态库在编译的时候被固定在了可执行文件中。-- ideawu注)(基于错误翻译的错误理解)

网友 yourhero 的解释:

我觉得这个你的理解有点偏差,据我理解,作者说的意思是,静态链接库在使用它的程序连接的时候需要用,连接完成后生成的可执行文件可以直接运行,不用在需 要这个lib文件了; 而动态库则不一样,在调用它的程序连接时需要使用lib文件(如果有),生成的可执行文件也不能单独使用,而必须和dll文件一起才可以执行。

共享链接库(也叫做动态链接库)是分两步链接进程序中的。首先,在编绎的时候,链接器查找出程序需要的所有符号(再提一次,函数,变量等等),然后链接进程序当中或者程序的另一个共享链接库当中。动态链接库中的目标文件并没有固化进可执行文件。替代的是,当程序运行的时候,由系统的一个程序(叫做动态装载器 dynamic libraries)检查程序需要哪些动态链接库,然后把它们装入内存并且与内存中的程序关联。

这种复杂的动态加载过程使得程序的启动稍微变慢,但这是一个不值一提的缺点,因为已经被它的强大的优点给掩盖住了 -- 当第二个程序需要相同的动态链接库时,它可以使用内存中相同的动态链接库的复本,因此省了很多内存。例如,标准“C”库是一个常用的动态链接库,被所有的C程序使用。但是,任一时刻内存中只有一个它的复本。这意味着我们需要更少的内存来运行我们的程序,而且可执行文件变得更小了,也省了很多磁盘空间。

无论如何,这种方式还是有一个缺点。如果我们重新编绎了一个动态链接库并且尝试用新的链接库来运行我们的程序的第二个复本,我们就会立即被困住 -- 动态加载器会发现内存中已经有了一个链接库的复本,就不再从磁盘加载新的(修改过的)版本。有方法可以解决这个问题,我们将在最后一节讨论。

翻译自:http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html 的部分。

Related posts:

  1. 同时运行多个版本的Firefox
  2. Firefox火狐安装Flash插件
  3. C#封装log4net
  4. LevelDB 写操作出现停顿的问题分析
  5. 高性能并发Web服务器实现核心内幕
Posted by ideawu at 2006-02-19 10:31:00

5 Responses to "静态和动态链接库"

  • 回复Zark: 可能是翻译笔误, 也可能是原来作者的笔误, 无论如何, 这种错误确实很低级, 很抱歉误导大家. 我再次到原文的链接, 发现原文与现今的中文翻译不同, 我已经改正. Reply
  • 纯粹胡扯!一帮菜鸟还跟着拍马屁,我晕!

    共享库怎么刻可能会是“静态链接”!有点常识好不好

    你们到底知不知道“动态链接”中的动态是什么意思! Reply
  • only the program’s executable file is needed in order to run the program

    这句话的意思就是说运行程序的时候只需要执行文件就可以了(即不再需要库文件)。也就是隐晦说明动态库的话需要保留库文件以便执行的时候进行链接吧…… Reply
  • yourhero正解。厉害。 Reply
  • (我没有理解这一段话的意思。看起来作者也应该不知道自己在讲什么。不过,我知道,静态库在编译的时候被固定在了可执行文件中。– ideawu注)

    我觉得这个你的理解有点偏差,据我理解,作者说的意思是,静态链接库在使用它的程序连接的时候需要用,连接完成后生成的可执行文件可以直接运行,不用在需要这个lib文件了; 而动态库则不一样,在调用它的程序连接时需要使用lib文件(如果有),生成的可执行文件也不能单独使用,而必须和dll文件一起才可以执行。
    Reply

Leave a Comment