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

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


当前回答

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.

其他回答

共享库是.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++库的特定版本,则使用静态库。

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

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

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

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.

简化:

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

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

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