GCC【5】- 态库和共享库

文章目录

  • 前言
  • 一、什么是静态库
    • 静态库的创建和应用(含例子)
  • 二、什么是动态库
  • 三、静态库和共享库的区别


前言


一、什么是静态库

  • 静态库(.a):程序在编译链接的时候把库代码链接到可执行文件中

静态库的创建和应用(含例子)

第一步:将各模块编译为.o文件 g++ -c xxx.cpp

第二步:将.o文件打包到静态库当中(libmain.a是创建的静态库名字)

第三步:此时静态库则创建完成,生成可执行文件编译即可

GCC【5】- 态库和共享库_第1张图片

二、什么是动态库

  • 共享库(.so或者.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码
    共享库的创建和应用(含例子)

第一步:g++ -fpic -shared -o xxxx.so xxx.cpp

第二步:拷贝到lib库:cp libmain.so /usr/lib (libmain.so是共享库格式)

第三步:链接动态可执行文件:g++ -o amain main.cpp -lmain (amain是共享库链接)

GCC【5】- 态库和共享库_第2张图片

三、静态库和共享库的区别

  • 静态库被程序静态链接于编译时,共享库被动态链接于运行时;
  • 静态链接时,需要把所有对静态库的引用内容都嵌入到最终的可执行文件中,且相同模块并不共用,都有相应的副本,因此相应的可执行文件在磁盘和内存中所占空间较大;而动态链接是发生在运行时的,并且是共享的,因此相应的可执行文件在磁盘中所占空间较小;
  • 由于静态链接是在编译时完成的,因此可执行文件中以及包含有所需的静态库,可执行文件可以单独运行;由于动态链接是在程序运行时完成的,可执行文件在加载入内存运行时才会链接共享库,因此可执行文件必需共享库的支持,不能单独运行;
  • 当静态库中某个模块更新后,需要重新编译链接生成相应的可执行文件;另一方面若共享库中某个模块更新了,只要接口没有改变,就不需要重新编译链接生成可执行文件;
  • 静态链接比动态链接速度稍快;
  • 静态库中不能包含共享库,而共享库中可以包含静态库。
    综合以上区别,可以发现动态链接的性能是明显优于静态链接的,但是这不一定就说明静态链接一定比不上动态链接了。如果库本身就比较小且不经常改变,基于速度的角度,应当选择静态链接,否则还是应当选择动态链接,由于是大型软件需要经常维护、扩展之类的情况。除此之外,静态链接的一个显著优点是其相应的可执行文件已经是完整的,包含所有所需的模块,因此可以很方便地移动到其他地方执行。

你可能感兴趣的:(linux操作系统,linux)