静态链接库(STATIC)和动态链接库(SHARED)

  静态链接库、动态链接库的区别和特点。

静态链接库

概念

  静态链接库是以.a为后缀的文件(window下以.lib为后缀)。和库相关的所有代码都在这个文件中,它在编译时直接链接到程序中。如果一个程序使用静态编译,它会从静态链接库中复制需要的那部分代码,并使其成为程序的一部分

特点

  • 对静态库的链接是在编译时期完成的。
  • 由于程序是直接从静态库中复制代码,所以生成的二进制文件的体积会比较大
  • 正是因为第二个特点程序会将静态库中代码整合成为程序的一部分,所以使得生成的程序移植十分方便。因为程序在运行时已经和库之间没有联系。
  • 静态库更新时,使用它的应用程序需要重新编译

示意图

static

  图片来源:Tyler’s Blog-C++静态库与动态库

动态链接库

概念

  动态链接库是以.so为后缀的文件(windows下以.dll为后缀,OS X下以.dylib为后缀)。和库相关的所有代码都在这个文件中,它在程序运行时被引用。如果一个程序使用动态编译,它只会引用需要的那部分代码,不会将库中代码和自身整合在一起。

特点

  • 动态库是在程序运行时被链接的。
  • 每个使用动态库的程序都只引用动态库的代码,使得二进制文件体积较小
  • 动态库更新时,不需要重新编译使用它的应用程序。
  • 动态库会增加额外的程序运行时间,因为需要在运行时链接库中相关代码。

示意图

shared

  图片来源:Tyler’s Blog-C++静态库与动态库

总结

  静态链接库和动态链接库有各自的特点,一般情况下为了节省内存资源我们会比较多的使用动态库,但是在需要保证应用程序不受外部依赖限制的时候我们会使用静态库。

参考链接

Stack Overflow–Difference between static and shared libraries
Tyler’s Blog-C++静态库与动态库