【Linux】静态库和共享库

目录

库是什么

静态库和共享库

库的链接

优缺点

查看使用的库

制作库

制作静态库

静态库的使用

制作共享库

共享库的使用

静态库和共享库的区别


库是什么

库就是预先编译好的方法的集合

.h中是库函数的声明,库函数的实现在库中,如:printf库函数的实现在libc.so(c动态库)中

因为库函数不用修改,只用链接就可以,减少编译消耗时间,所以库中的文件都是.o文件

静态库和共享库

库分为静态库和共享库。静态库为libxx.a,共享库为libxx.so,  xx是库的名字,现在基本上都使用共享库

Windows上静态库为.lib,动态链接库为.dll

库的链接

        静态库将库中的那些方法包含在可执行程序中

        共享库标记程序中用到共享库的方法,运行程序时动态链接,即运行程序时寻找库。

优缺点

静态库的

优点:如果计算机上没有这个静态库,程序依旧可以运行,因为程序已经包含了这个库;

缺点:程序体积较大,磁盘到内存空间都被占了。

共享库的

优点:程序体积较小,一份库放在内存中大家都可以共享使用;

缺点:1.计算机上要有使用了的所有动态库,如果运行程序时找不到这个库,则运行错误。2.运行程序时装载库,程序可能变慢。

查看使用的库

静态库成为程序的一部分了,所以无法查看

共享库:ldd 程序名

可以看到链接了三个库,两个是linux默认的,还有一个c库(用到了printf)

制作库

一些文件的位置:

头文件  /usr/include

库文件  /usr/lib,/lib

可执行程序  /usr/bin,/bin  (sbin是管理员用的命令,bin都可以使用)

例如pwd,在bin中可以直接使用,而不用把它的绝对路径输出出来

制作静态库

1.将所有.c编译成.o

2.使用ar命令将所有.o程序打包到一个库中

c创建库,r将方法添加到库中,v显示过程(可有可无)

静态库的使用

使用时,只用传头文件.h,编译链接使用-L、-l告诉main程序用哪个库

-L指定库的位置,-l指定库的名称(不加前缀lib和扩展名.a)中间没有空

如果不用-L-l,编译会报错:找不到这个方法

但是如果库和头文件在标准目录下/usr/lib和/usr/include,可以省略-L

编译后删掉库依旧可以再次执行

制作共享库

第一步与静态库一样

第二步使用gcc命令将第一步编译的所有.o文件生成共享库

共享库的使用

编译跟静态库是一样的

编译完不能直接运行(./main),因为他找不到动态库,运行时找库只在标准位置(/lib或/usr/lib等)中寻找,编译时是把路径告诉给gcc链接的位置,运行时不在那个位置找

两个方法解决此问题:

  1. 用环境变量告诉main在某个位置装载库(多用于测试)

echo $LD_LIBRARY_PATH

LD_LIBRARY_PATH = 库的位置  //位置赋值

export LD_LIBRARY_PATH  //做成环境变量  

这样把库的位置放到PATH中

  1. 把库挪到标准目录下(优)

在Ubuntu中/usr/lib跟/lib是一个位置

静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做
标记,在运行程序时,才动态加载。

就算删除了静态库,程序也可以执行

更新库时静态库必须重新编译,而共享库新库可以直接覆盖旧库

理论上共享库比静态库小

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曦樂~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值