0%

C++ shared libraries和static libraries之间的区别

前言

翻译自stack overflow上的一个回答,介绍了C++中static和shared libraries之间的区别。

区别

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

Statiic libraries是.a文件(在Windows中是.lib),所有与库相关的代码都在这个文件中,并且在程序编译时直接链接到程序中。使用static library的程序从静态库中获取静态库代码的副本,并将其作为程序的一部分。【Windows还具有用于引用.dll文件的.lib文件,但它们的行为与第一个相同。】

优劣

两种方法的都有各自的优势与劣势:

  • Shared libraries减少了使用该库的每个程序中重复的代码量,从而使二进制文件较小。它还允许用功能上等效但可能提升性能的共享对象替换共享对象,而无需重新编译使用共享对象的程序。但是,由于库中的所有符号都需要连接到它们使用的东西,因此共享库在执行函数时将花费少量的额外代价,并且在运行时会有额外开销。此外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的通用机制。
  • Statiic libraries增加了二进制文件的整体大小,但这意味着无需携带正在使用的库的副本。 由于代码是在编译时连接的,因此没有任何额外的运行时加载成本。

一般来说共享库使用得多,但是在需要确保二进制文件没有很多可能难以满足的外部依赖项时,可以使用静态库,例如C ++标准库的特定版本或Boost C ++库的特定版本。