【Linux学习】静态库和共享库

目录

一、什么是静态库

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

二、什么是共享库

共享库的创建和应用(含例子)

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


一、什么是静态库

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

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

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

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

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

例子:

二、什么是共享库

  • 共享库(.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是共享库链接)

例子:

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

  • 静态库被程序静态链接于编译时,共享库被动态链接于运行时;
  • 静态链接时,需要把所有对静态库的引用内容都嵌入到最终的可执行文件中,且相同模块并不共用,都有相应的副本,因此相应的可执行文件在磁盘和内存中所占空间较大;而动态链接是发生在运行时的,并且是共享的,因此相应的可执行文件在磁盘中所占空间较小;
  • 由于静态链接是在编译时完成的,因此可执行文件中以及包含有所需的静态库,可执行文件可以单独运行;由于动态链接是在程序运行时完成的,可执行文件在加载入内存运行时才会链接共享库,因此可执行文件必需共享库的支持,不能单独运行;
  • 当静态库中某个模块更新后,需要重新编译链接生成相应的可执行文件;另一方面若共享库中某个模块更新了,只要接口没有改变,就不需要重新编译链接生成可执行文件;
  • 静态链接比动态链接速度稍快;
  • 静态库中不能包含共享库,而共享库中可以包含静态库。

综合以上区别,可以发现动态链接的性能是明显优于静态链接的,但是这不一定就说明静态链接一定比不上动态链接了。如果库本身就比较小且不经常改变,基于速度的角度,应当选择静态链接,否则还是应当选择动态链接,由于是大型软件需要经常维护、扩展之类的情况。除此之外,静态链接的一个显著优点是其相应的可执行文件已经是完整的,包含所有所需的模块,因此可以很方便地移动到其他地方执行。


补充:main.cpp 内的演示代码(简单的1-100  求和)

源代码

#include<iostream>

int main()
{
  int sum=0;
  for(int i=1;i<=100;i++)
  {
        sum += i;
  }
  std::cout<<sum<<std::endl;
  return 0;

}

这边仅仅只是做一个练习,仅供参考

参考:Linux下静态库、共享库的创建与应用_HerofH_的博客-CSDN博客_静态库的创建与使用

猜你喜欢

转载自blog.csdn.net/m0_61745661/article/details/123597887