静态库和共享库有什么区别?
我使用Eclipse,并且有几种项目类型,包括“静态库”和“共享库”?一个人比另一个人有优势吗?
静态库和共享库有什么区别?
我使用Eclipse,并且有几种项目类型,包括“静态库”和“共享库”?一个人比另一个人有优势吗?
Answers:
共享库是.so(或Windows .dll或OS X .dylib)文件。与该库有关的所有代码都在此文件中,并且运行时使用它的程序会引用它。使用共享库的程序仅引用其在共享库中使用的代码。
静态库是.a(或在Windows .lib中)文件。与库有关的所有代码都在此文件中,并且在编译时直接链接到程序中。使用静态库的程序从静态库获取其使用的代码的副本,并将其作为程序的一部分。[Windows也有用于引用.dll文件的.lib文件,但它们的作用与第一个相同。]
每种方法都有优点和缺点:
共享库减少了使用该库的每个程序中重复的代码量,从而使二进制文件较小。它还允许您用功能上等效的共享对象替换共享对象,但可能会增加性能优势,而无需重新编译使用共享对象的程序。但是,共享库将为函数的执行带来少量的额外成本以及运行时的加载成本,因为库中的所有符号都需要连接到它们使用的事物。另外,可以在运行时将共享库加载到应用程序中,这是实现二进制插件系统的通用机制。
静态库增加了二进制文件的整体大小,但这意味着您无需携带正在使用的库的副本。由于代码是在编译时连接的,因此没有任何额外的运行时加载成本。代码就在那里。
就个人而言,我更喜欢共享库,但是在需要确保二进制文件没有很多可能难以满足的外部依赖项时使用静态库,例如C ++标准库的特定版本或Boost C ++库的特定版本。
对于静态库,链接器从库中提取代码,并将其用于在编译/构建应用程序时构建最终的可执行文件。最终可执行文件在运行时不依赖库
对于共享库,编译器/链接器会在构建应用程序时检查与您链接的名称是否存在于库中,但不会将其代码移入应用程序。在运行时,共享库必须可用。
C编程语言本身没有静态库或共享库的概念-它们完全是一种实现功能。
就个人而言,我更喜欢使用静态库,因为它使软件分发更简单。但是,这是过去关于大量(象征性)流血的观点。
静态库作为应用程序的一部分进行编译,而共享库则不是。当您分发依赖共享库的应用程序时,这些库例如。需要在MS Windows上安装dll。
静态库的优点是运行应用程序的用户不需要依赖项-例如,他们不必升级其DLL。缺点是您的应用程序较大,因为您将其附带所有需要的库。
共享库除了导致更小的应用程序外,还使用户能够使用自己的,也许是更好的版本的库,而不必依赖于应用程序一部分
共享库的最大优点是,无论使用该库的进程有多少,内存中仅加载一个代码副本。对于静态库,每个进程都会获得自己的代码副本。这会导致大量的内存浪费。
OTOH,静态库的一个优点是所有内容都捆绑到您的应用程序中。因此,您不必担心客户端在其系统上将具有正确的库(和版本)。
.so
* nix系统上的文件有点是共享(动态)库。
除了所有其他答案之外,还没有提到的一件事就是去耦:
让我说说我一直在处理的真实世界的生产代码:
一个很大的软件,由300多个项目组成(使用Visual Studio),主要是作为静态库构建的,最后都链接到一个巨大的可执行文件中,最终会遇到以下问题:
-链接时间非常长。您可能最终会花费超过15分钟的链接时间,例如10秒钟的编译时间-一些工具拥有如此大的可执行文件,例如必须检查代码的内存检查工具。您可能会陷入被视为傻瓜的极限。
更麻烦的是软件的解耦:在这个实际的示例中,每个项目的头文件都可以从其他任何项目访问。结果,一个开发人员添加依赖非常容易。它只是包含标题,因为结尾处的链接将允许查找符号。它以可怕的循环依赖和完全混乱而告终。
对于共享库,这需要一些额外的工作,因为开发人员必须编辑项目构建系统以添加从属库。我观察到共享库代码倾向于提供更简洁的代码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 | |
-------------------------------------------------------------------------