静态库和共享库有什么区别?
我使用Eclipse,有几种项目类型,包括静态库和共享库?一个人比另一个人有优势吗?
答案 0 :(得分:696)
共享库是.so(或在Windows .dll或OS X .dylib中)文件。与库相关的所有代码都在此文件中,并且在运行时使用它来引用它。使用共享库的程序仅引用它在共享库中使用的代码。
静态库是.a(或Windows .lib)文件。与库相关的所有代码都在此文件中,并在编译时直接链接到程序中。使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分。 [Windows也有.lib文件,用于引用.dll文件,但它们的行为与第一个文件相同]。
每种方法都有优点和缺点。
共享库减少了每个使用库的程序中重复的代码量,使二进制文件保持较小。它还允许您使用功能相同的对象替换共享对象,但可以增加性能优势,而无需重新编译使用它的程序。但是,共享库在执行函数时会产生额外的小额成本以及运行时加载成本,因为库中的所有符号都需要连接到它们使用的东西。此外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的一般机制。
静态库会增加二进制文件的总体大小,但这意味着您不需要携带正在使用的库的副本。由于代码在编译时连接,因此没有任何额外的运行时加载成本。代码就在那里。
就个人而言,我更喜欢共享库,但在需要确保二进制文件没有很多可能难以满足的外部依赖项时使用静态库,例如C ++标准库的特定版本或Boost C ++的特定版本库。
答案 1 :(得分:362)
静态库就像一个书店,共享库就像......一个库。使用前者,您可以获得自己的书籍/功能副本带回家;与后者你和其他人去图书馆使用相同的书/功能。所以任何想要使用(共享)库的人都需要知道它在哪里,因为你必须“去获取”书籍/功能。使用静态库,书籍/功能是您自己的,并且您将它保存在您的家庭/程序中,一旦您拥有它,您就不在乎何时何地获得它。
答案 2 :(得分:62)
简化为:
答案 3 :(得分:31)
对于静态库,代码由链接器从库中提取,并用于在编译/构建应用程序时构建最终的可执行文件。最终的可执行文件在运行时没有依赖于库
对于共享库,编译器/链接器会在构建应用程序时检查链接的名称是否存在于库中,但不会将其代码移动到应用程序中。在运行时,共享库必须可用。
C编程语言本身没有静态库或共享库的概念 - 它们完全是一种实现功能。
就个人而言,我更喜欢使用静态库,因为它使软件分发更简单。然而,这是一种关于过去流失多少(象征性)血液的意见。
答案 4 :(得分:28)
静态库是作为应用程序的一部分编译的,而共享库则不是。当您分发依赖于共享库的应用程序时,例如,库。需要安装MS Windows上的dll。
静态库的优点是运行应用程序的用户不需要依赖项 - 例如他们没有必要升级他们的DLL。缺点是您的应用程序规模较大,因为您将它与所需的所有库一起发货。
除了导致较小的应用程序之外,共享库还为用户提供了使用他们自己的,可能更好的库版本的能力,而不是依赖于应用程序的一部分
答案 5 :(得分:17)
共享库的最大优点是,无论有多少进程使用该库,内存中只加载了一个代码副本。对于静态库,每个进程都有自己的代码副本。这可能会导致大量内存浪费。
OTOH,静态库的一个优点是所有东西都捆绑在你的应用程序中。因此,您不必担心客户端将在其系统上提供正确的库(和版本)。
答案 6 :(得分:6)
除了所有其他答案之外,尚未提及的一件事是脱钩:
让我谈谈我一直在处理的真实世界生产代码:
一个非常大的软件,由> 300个项目(使用visual studio)组成,主要构建为静态库,最后所有链接在一个巨大的可执行文件中,最终会出现以下问题:
-Link时间非常长。你最终可能会超过15分钟的链接,因为我们说编译时间是10秒 - 有些工具在他们的膝盖上有如此大的可执行文件,比如必须检测代码的内存检查工具。你可能会陷入被视为傻瓜的极限。
更有问题的是你的软件脱钩:在这个现实世界的例子中,每个项目的头文件都可以从任何其他项目中获得。因此,一个开发人员很容易添加依赖项;它只是包括标题,因为最后的链接将全部找到符号。它最终会受到可怕的骑行依赖和完全混乱的影响。
使用共享库,这需要额外的工作,因为开发人员必须编辑项目构建系统以添加依赖库。我发现共享库代码往往提供更清晰的代码API。
答案 7 :(得分:0)
-------------------------------------------------------------------------
| +- | 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 | |
-------------------------------------------------------------------------
答案 8 :(得分:0)
+---------------+---------------------------+------------------------------+
| properties | Static library | Shared library |
+===============+===========================+==============================+
| Linking time | It happens as the | Shared libraries |
| | last step of the | are added during |
| | compilation process. | linking process |
| | After the program | when executable |
| | is placed | file and libraries |
| | in the memory | are added to the memory. |
+---------------+---------------------------+------------------------------+
| Means | Performed by linkers | Performed by operating System|
+---------------+---------------------------+------------------------------+
| Size | Static libraries are | Dynamic libraries are |
| | much bigger in size, | much smaller, because |
| | because external | there is only one copy |
| | programs are built | of dynamic library |
| | in the executable file. | that is kept in memory. |
+---------------+---------------------------+------------------------------+
| External file | Executable file will | In shared libraries, |
| changes | have to be recompiled | no need to recompile |
| | if any changes were | the executable. |
| | applied to external files.| |
+---------------+---------------------------+------------------------------+
| Time | Takes longer to execute | It is faster |
| | because loading into the | because shared |
| | memory happens every time | library code is |
| | while executing. | already in the memory. |
+---------------+---------------------------+------------------------------+
| Compatibility | Never has a compatibility | Programs are dependent |
| | issue,since all code is | on having a compatible |
| | in one executable module. | library.Dependent program |
| | | will not work if library |
| | | gets removed from the system |
+---------------+---------------------------+------------------------------+