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

静态库和共享库之间有什么区别

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

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

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

每种方法都有优点和缺点:

  • 共享库减少了使用库的每个程序中重复的代码量,从而使二进制文件保持较小。它还允许您将共享对象替换为功能等效的对象,但可能会增加性能优势,而无需重新编译使用它的程序。然而,由于库中的所有符号都需要连接到它们所使用的东西,因此共享库在执行函数时会有一点额外的成本以及运行时加载成本。此外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的一般机制

  • 静态库增加了二进制文件的总体大小,但这意味着您不需要携带正在使用的库的副本。由于代码是在编译时连接的,因此没有任何额外的运行时加载成本。代码就在那里

个人而言,我更喜欢共享库,但在确保二进制文件没有很多可能难以满足的外部依赖性时,使用静态库,如C++标准库的特定版本或Boost C++库的特定版本。

发表评论