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

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


对于静态库,代码由链接器从库中提取,并在编译/构建应用程序时用于构建最终的可执行文件。最终的可执行文件在运行时不依赖于库

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

C编程语言本身没有静态库或共享库的概念——它们完全是一种实现特性。

就我个人而言,我更喜欢使用静态库,因为它使软件分发更简单。然而,这一观点在过去曾引发大量(象征性的)流血冲突。


共享库最显著的优点是,不管有多少进程在使用这个库,内存中只加载一份代码。对于静态库,每个进程都有自己的代码副本。这可能导致严重的内存浪费。

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


简化:

静态链接:一个大型可执行文件 动态链接:一个小的可执行文件加上一个或多个库文件(Windows上是.dll文件,Linux上是.so文件,macOS上是.dylib文件)


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

静态库的优点是用户运行应用程序时不需要依赖任何东西——例如,他们不需要升级他们的DLL。缺点是您的应用程序的大小更大,因为您附带了它所需的所有库。

除了导致更小的应用程序之外,共享库还为用户提供了使用他们自己的,也许是更好版本的库的能力,而不是依赖于应用程序的一部分


共享库是.so(或在Windows .dll中,或在OS X .dylib中)文件。所有与库相关的代码都在这个文件中,运行时使用它的程序会引用它。使用共享库的程序只引用它在共享库中使用的代码。

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

每种方法都有优缺点:

Shared libraries reduce the amount of code that is duplicated in each program that makes use of the library, keeping the binaries small. It also allows you to replace the shared object with one that is functionally equivalent, but may have added performance benefits without needing to recompile the program that makes use of it. Shared libraries will, however have a small additional cost for the execution of the functions as well as a run-time loading cost as all the symbols in the library need to be connected to the things they use. Additionally, shared libraries can be loaded into an application at run-time, which is the general mechanism for implementing binary plug-in systems. Static libraries increase the overall size of the binary, but it means that you don't need to carry along a copy of the library that is being used. As the code is connected at compile time there are not any additional run-time loading costs. The code is simply there.

就我个人而言,我更喜欢共享库,但当需要确保二进制文件没有许多难以满足的外部依赖时,例如c++标准库的特定版本或Boost c++库的特定版本,则使用静态库。


A static library is like a bookstore, and a shared library is like... a library. With the former, you get your own copy of the book/function to take home; with the latter you and everyone else go to the library to use the same book/function. So anyone who wants to use the (shared) library needs to know where it is, because you have to "go get" the book/function. With a static library, the book/function is yours to own, and you keep it within your home/program, and once you have it you don't care where or when you got it.


在所有其他答案中,有一件事还没有被提及,那就是脱钩:

让我来谈谈我一直在处理的一个真实世界的生产代码:

一个非常大的软件,由>300个项目(visual studio)组成,主要构建为静态库,最后所有链接在一个巨大的可执行文件中,你最终会遇到以下问题:

-链接时间过长。你可能会有超过15分钟的链接,比如10秒的编译时间 -有些工具在处理这么大的可执行文件时是非常困难的,比如内存检查工具,它们必须检测代码。你可能会陷入被视为傻瓜的极限。

更有问题的是软件的解耦:在这个真实的例子中,任何其他项目都可以访问每个项目的头文件。因此,对于一个开发人员来说,添加依赖项非常容易;它只是包括标题,因为链接在最后将允许waws找到符号。它以可怕的循环依赖和完全混乱而告终。

使用共享库,需要做一些额外的工作,因为开发人员必须编辑项目构建系统来添加依赖库。我发现共享库代码往往提供更简洁的代码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  |                                     |
-------------------------------------------------------------------------

+---------------+---------------------------+------------------------------+
| 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 |
+---------------+---------------------------+------------------------------+