2010-04-15 76 views
428

静态库和共享库有什么区别?静态库和共享库之间的区别?

我使用Eclipse,并且有几个项目类型,包括静态库和共享库?一个人比另一个人有优势吗?

+3

维基百科有静态,动态和共享库之间的区别的[很好的描述(http://en.wikipedia.org/wiki/Library_%28computing%29)。 – 2010-04-15 22:13:56

回答

595

共享库。所以(的能力或在Windows .dll或OS X .dylib)文件中。所有与库相关的代码都在这个文件中,并且在运行时被程序使用。使用共享库的程序仅引用它在共享库中使用的代码。

静态库是.a(或在Windows .lib中)文件。所有与库有关的代码都在这个文件中,并且它在编译时直接链接到程序中。使用静态库的程序从静态库中获取它使用的代码的副本,并将其作为程序的一部分。 [Windows也有。lib文件用于引用.dll文件,但它们的作用与第一个文件相同]。

每种方法都有优点和缺点。

共享库减少在每个,使得使用该库的程序复制的代码量,保持二进制小。它还允许您用功能相同的替换共享对象,但可能增加了性能优势,而无需重新编译使用它的程序。然而,共享库对于执行函数以及运行时加载成本都会有小的额外成本,因为库中的所有符号都需要连接到它们使用的东西。另外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的一般机制。

静态库增加了二进制的整体大小,但它意味着你不需要沿着正在使用的库的副本携带。由于代码在编译时连接,所以没有任何额外的运行时加载成本。代码就在那里。个人而言,我更喜欢共享库,但在需要确保二进制文件没有很多可能难以满足的外部依赖性时使用静态库,例如特定版本的C++标准库或特定版本的Boost C++库。

+2

的一部分“替换为共享对象...功能上等同的,但可能[改善]性能”:特别,相当于在语义使用API​​的功能面临主叫方(应用程序编程接口:函数签名和变量,包括类型),但实现端功能可以在比PERF:例如,功能更会随时记录到文件不同 - >也登录到TCP服务器:端口预计为$ MY_APP_LOG_SERVER。 – 2014-02-21 06:19:37

+1

“[.sos incur a]小额外成本为功能”执行 - 这是*可能*(如果功能组/排序已经为高速缓存位置在静态链接进行优化,或由于OS古怪/装载机/编译器/像跨网段/大指针PERF架构。惩罚),但是在许多体系结构/编译器设置中,动态链接器将调用打补丁以创建完全相同的调用机器操作码。 – 2014-02-21 06:36:43

+2

“由于代码在编译时连接,所以没有任何额外的运行时加载成本,代码就在那里。” - 是的,没有...它所有的可执行映像准备在被寻呼,如果在执行要求,但是 - 从你的程序还没有运行最近足够缓存的情况下开始 - 与共享库这是可能的(有时可能或某些)操作系统,驱动程序或其他正在运行的程序已经加载了您的应用程序要使用的共享库,在这种情况下,它可能在缓存中,并且程序启动并运行得更快。 – 2014-02-21 06:40:35

24

对于静态库,代码从库链接器,提取并使用在编译/构建应用程序的角度来构建最终的可执行文件。最终的可执行文件在运行时对库没有依赖关系

对于共享库,编译器/链接程序在生成应用程序时检查链接的名称是否存在于库中,但不会将其代码移入应用程序。运行时,共享库必须可用。

C编程语言本身没有静态或共享库的概念 - 他们是完全实现的功能。

就个人而言,我更喜欢使用静态库,因为它使软件分发简单。然而,这是一个意见,过去有多少(比喻)血液流出。

+3

+1“C编程语言本身没有静态或共享库的概念 - 它们完全是一个实现功能。“ – Tiger 2016-03-08 14:22:22

14

共享库的最显著的优点是,只有一个在内存中加载代码副本,无论有多少进程如何使用图书馆。对于静态库,每个进程都会获得自己的代码副本。这可能会导致显着的内存浪费。

OTOH,静态库的一个优点是所有东西都捆绑到您的应用程序中。因此,您不必担心客户端系统上可以使用正确的库(和版本)。

+1

可执行映像较大磁盘上,以及在内存中,使用静态库时。 – JustJeff 2010-04-15 22:19:32

+0

那是正确的,这就是我在影射我说一切都捆绑到应用程序中。 – Jasmeet 2010-04-15 22:40:54

46

简化:

  • 静态链接:一个大的可执行
  • 动态链接:一个小的可执行加上一个或多个库文件(在Windows .dll文件,。所以在Linux上,或名为.dylib在MacOS )
26

静态库被编译为应用程序的一部分,而共享库都没有。当您分发依赖于共享库的应用程序时,库,例如。需要安装MS Windows上的dll。

静态库的优点是,有运行的应用程序为用户无需依赖关系 - 例如他们不必升级他们的任何DLL ......缺点是你的应用程序的体积较大,因为你正在运送它所需的所有库。

除了为龙头,以较小的应用程序,共享库提供给用户使用自己的,也许更好的版本库中而不是依靠一个是应用程序的一部分

+2

DLL地狱,因为它已经知道 – gheese 2013-11-01 15:45:19

+1

“静态库被编译为应用程序的一部分” ...静态库被编译为静态库和链接作为应用 – user463035818 2017-07-12 10:23:01

323

静态库就像书店,共享库就像一个库。与前者一样,你可以将自己的书/功能副本带回家;与后者,你和其他人去图书馆使用相同的书/功能。所以任何想要使用(共享)库的人都需要知道它在哪里,因为你必须“去”获取书/功能。通过一个静态库,这本书/函数是你自己拥有的,并且将它保存在你的家庭/程序中,一旦你拥有了它,你就不会在意何时何地获得它。

2

在所有其他答案的上方,有一件事不mentionned尚未被解耦:

让我谈谈现实世界的生产代码,我一直在处理:

一个非常大的软件,由> 300个项目(使用Visual Studio),主要是建设成为静态库最后全部链接在一起,在一个巨大的可执行文件,你结束了以下问题:

-Link时间极长。你可能最终需要超过15分钟的链接,比如说编译时间为10s - 有些工具正在他们的膝盖上,这样一个很大的可执行文件,比如内存检查工具,必须对代码进行测试。你可能会陷入被认为是愚蠢的极限。

更成问题的是你的软件的解耦:在这个现实世界的例子,标题每个项目的文件来自其他任何项目reacheable。因此,一个开发人员添加依赖关系非常容易;它只是包括标题,因为链接最后会全部找到符号。它最终由可怕的自行车依赖和完全混乱。

为共享库,它是一些额外的工作,因为开发人员必须修改项目构建系统添加依赖库。我观察到共享库代码倾向于提供更干净的代码API。