【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博客_静态库的创建与使用

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿力猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值