静态库和共享库有什么区别?
我使用的是Eclipse,其中包括静态库和共享库等多种项目类型。它们之间是否存在优劣之分?
静态库和共享库有什么区别?
我使用的是Eclipse,其中包括静态库和共享库等多种项目类型。它们之间是否存在优劣之分?
共享库是.so文件(Windows中是.dll,OS X中是.dylib)。所有与库相关的代码都在此文件中,并且程序在运行时使用它进行引用。使用共享库的程序仅引用它使用的共享库中的代码。
静态库是.a文件(Windows中是.lib)文件。所有与库相关的代码都在此文件中,并且在编译时直接链接到程序中。使用静态库的程序会从静态库中复制其所使用的代码,并将其作为程序的一部分。[Windows还有用于引用.dll文件的.lib文件,但它们的作用方式与第一个相同]。
每种方法都有优缺点:
共享库减少了每个使用该库的程序中重复的代码量,使二进制文件更小。它还允许您将共享对象替换为具有附加性能优势但不需要重新编译使用它的程序的功能等效的对象。共享库将具有执行函数的小额外成本以及运行时加载成本,因为库中的所有符号都需要连接到它们使用的内容。此外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的通用机制。
静态库增加了二进制文件的总体大小,但这意味着您不需要携带正在使用的库的副本。由于代码在编译时连接,因此没有任何额外的运行时加载成本。代码就在那里。
个人而言,我更喜欢使用共享库,但在需要确保二进制文件没有许多可能难以满足的外部依赖项(例如特定版本的C++标准库或特定版本的Boost C++库)时会使用静态库。
静态库就像一家书店,而共享库就像一家图书馆。使用前者,您可以获得自己的书 / 函数副本带回家;而对于后者,您和其他人都必须去图书馆使用同一本书/函数。因此,想要使用(共享的)库的任何人都需要知道它在哪里,因为您必须“取得”这本书/函数。使用静态库时,这本书/函数归您所有,您将其保留在自己的家庭/程序中,一旦拥有它,您不再关心它在何时何地获取。
简化版:
静态库是作为应用程序的一部分编译的,而共享库则不是。当您分发依赖于共享库的应用程序时,这些库(例如在MS Windows上的DLL)需要安装。
静态库的优点是用户在运行应用程序时不需要任何依赖项,例如他们不必升级其DLL。缺点是因为您将它与所有所需库一起发布,所以您的应用程序大小会更大。
除了导致较小的应用程序之外,共享库还为用户提供了使用自己可能更好的库版本的能力,而不是依赖于应用程序中的一个版本。
共享库最重要的优点是无论有多少进程使用该库,内存中只加载一份代码副本。而静态库每个进程都会获得自己的代码副本,这可能导致显著的内存浪费。
另一方面,静态库的一个优点是所有内容都被打包到应用程序中。因此,您不必担心客户端在其系统上是否有正确的库(和版本)可用。
.so
文件是一种共享(动态)库。 - Soner from The Ottoman Empire+---------------+---------------------------+------------------------------+
| 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 |
+---------------+---------------------------+------------------------------+
-------------------------------------------------------------------------
| +- | 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 | |
-------------------------------------------------------------------------