什么是静态和共享库之间的区别?
我使用Eclipse有几个项目类型,包括静态库和共享库? 难道一个有优势比其他?
什么是静态和共享库之间的区别?
我使用Eclipse有几个项目类型,包括静态库和共享库? 难道一个有优势比其他?
共享库。所以(或在Windows .dll或在OS X名为.dylib)文件。 与库中的所有代码都是在这个文件中,它是通过使用它在运行时程序引用。 使用共享库的程序只引用了它在共享库使用的代码。
静态库。一个(或Windows的.lib)文件。 与库中的所有代码都是在这个文件中,它直接链接到在编译时的程序。 使用静态库的程序需要,它从静态库使用,并使其成为计划的一部分代码的副本。 [Windows还具有的.lib这是用来引用.dll文件的文件,但他们的行为方式相同的第一个。
有每种方法的优点和缺点。
共享库减少在每个,使得使用的库的,保持二进制小程序复制的代码量。 它还允许您更换一个在功能上等同的共享对象,但可能有增加的性能优势,而无需重新编译,使得使用它的程序。 共享库会,但有功能的执行以及运行时加载成本一小笔额外成本库中的所有符号需要连接到他们所使用的东西。 此外,共享库可以被加载到在运行时应用程序,它是用于实现二进制插件系统的一般机制。
静态库增加了二进制的整体大小,但它意味着你不需要沿着正在使用的库的副本携带。 由于代码在编译时连接没有任何额外的运行时加载的费用。 该代码只是在那里。
就个人而言,我更喜欢共享库,但在需要的时候,以确保二进制文件没有多少外部依赖性可能难以满足,如C的特定版本++标准库或Boost的C ++库的具体版本使用静态库。
静态库就像一个书店和共享库是像...一个图书馆。 对于前者,你会得到你自己的书/功能带回家的复印件; 后者你和其他人去图书馆使用相同的书/功能。 因此,任何人谁愿意使用(共享)库需要知道它在哪里,因为你必须“走出去获得”书/功能。 对于静态库,书/功能是你自己的,你把它您的家庭/程序中,一旦你拥有了它,你不关心,或者当你得到它。
简化:
对于静态库,代码从库链接器,提取并使用在编译/构建应用程序的角度来构建最终的可执行文件。 最终的可执行文件具有在运行时间上图书馆没有依赖
对于共享库,这些名称与您联系的编译器/连接检查中,当应用程序生成,但不会将他们的代码到应用程序库中存在。 在运行时,共享库必须是可用的。
C编程语言本身没有静态或共享库的概念 - 他们是完全实现的功能。
就个人而言,我更喜欢使用静态库,因为它使软件分发简单。 然而,这是在其中的大部分(比喻)的血液已经在过去流下的意见。
静态库被编译为应用程序的一部分,而共享库都没有。 当您分发依赖于共享libaries,图书馆,如应用程序。 在MS Windows DLL的需要安装。
静态库的优点是,有没有用于运行应用程序的用户所需的依赖关系 - 例如,他们没有升级他们的任何的DLL。 缺点是你的应用是在尺寸更大,因为你是用它需要的所有库出货了。
除了为龙头,以较小的应用程序,共享库提供给用户使用自己的,也许更好的版本库中而不是依靠一个是应用程序的一部分的能力
共享库的最显著的优点是,只有一个在内存中加载代码副本,无论有多少进程如何使用图书馆。 对于静态库,每个进程都有自己的代码的副本。 这可能会导致显著内存浪费。
OTOH,静态库的一个优势是,一切都捆绑到应用程序中。 所以你不必担心客户将有权库(和版本)的系统上可用。
在所有其他答案的上方,有一件事不mentionned尚未被解耦:
让我来谈谈一个现实世界的生产代码,我一直在处理:
一个非常大的软件,由> 300个项目(使用Visual Studio),主要是建设成为静态库最后全部链接在一起,在一个巨大的可执行文件,你结束了以下问题:
-Link时间极长。 你可能会比链接的15分钟多结束了,对我们说的编译时间10S - 一些工具对他们的膝盖有这么大的可执行文件,如内存检查工具,仪器必须的代码。 您可能落入已被视为傻瓜达到极限。
更成问题的是你的软件的解耦:在这个现实世界的例子,标题每个项目的文件来自其他任何项目reacheable。 因此它是非常容易的一个开发人员添加的依赖; 它正要包括标题,因为在年底链接将allwaws找到符号。 它通过循环可怕的依赖性和完整的混乱结束。
随着共享库,它是一些额外的工作,因为开发人员必须修改项目构建系统添加依赖库。 我观察到共享库代码趋向于提供更干净的代码API。
-------------------------------------------------------------------------
| +- | Shared(dynamic) | Static Library (Linkages) |
-------------------------------------------------------------------------
|Pros: | less memory use | an executable, using own libraries|
| | | ,coming with the program, |
| | | doesn't need to worry about its |
| | | compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of | bigger memory uses |
| | libraries may be altered | |
| | subject to OS and its | |
| | version, which may affect| |
| | the compilebility and | |
| | runnability of the code | |
-------------------------------------------------------------------------