静态库和动态库

静态库和动态库

库:存放的是预先编译好的(.o文件)方法的集合;

Linux下,库分为静态库共享库

静态库:

生成静态库

静态库:库名:Libxxx.a,lib是库的前缀,xxx是库名,.a为静态库的后缀。

第一步:将需要生成静态库的.c文件转换为编译后的.o文件

命令:gcc -S mian.o mian.c

第二步:将编译完成的.o文件放到一个集合中,生成静态库

命令:ar cr(v,可以没有) libxxx.a x.o xx.o xxx.o    //c:create创建的意思 r:把方法添加到库里面  v:显示信息

使用静态库
在这里插入图片描述
动态库的连接:
我们在创建一个新的子目录test,在函数中声明add和max;
在这里插入图片描述

共享库:

生成动态库

共享库:库名:Libxxx.so,lib是库的前缀,xxx是库名,.so为共享库的后缀。

命令:gcc -shared -fPIC -o libxxx.so xx.c

-shared做共享库的命令,-fPIC是代码位置无关命令。

动态库的使用

在这里插入图片描述

注意:如果共享库和静态库重名,且在一个目录下,系统默认使用共享库

在这里插入图片描述
在这里,我们执行main
在这里插入图片描述
我们发现./main执行是错误的;这里就要提一句:我们在执行文件main时,我们就要寻找共享库,共享库如果在标准目录(usr/lib)底下,我们就找的到,不在标准目录底下,程序就找不到
在这里插入图片描述
我们用ldd查看当前文件的信息,发现共享库libfoo.so找不到,所以我们需要将共享库拷贝到user/lib
在这里插入图片描述
在这里插入图片描述

注意:共享库要将其放在标准目录下才能找到

库一般放在/lib    /usr/lib下,头文件在/usr/include下

默认只连接标准C库

可执行 /bin     /usr/bin

显示可执行程序用到哪些库  命令 ldd 可执行文件

ldd:查看可执行程序用到哪些共享库

共享库和静态库的区别:

静态库:

  • 静态函数库的扩展名一般为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib

  • 这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件体积会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,代码装载效率高,移植比较方便,而不再需要向外部要求读取函数库的内容;

  • 从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。(可维护性差)

共享库:

  • 动态函数库的扩展名一般为(.so或.dll),这类函数库通常名为libxxx.so或xxx.dll

  • 与静态函数库被整个捕捉到程序中不同,动态函数库在程序运行的时候进行链接,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。这样从产品功能升级角度方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。

  • 使用动态库会更加节省内存并减少页面交换;可以实现进程之间的资源共享。(所以又被称为共享库)

注意:静态库只在链接时找一次。动态库找两次,链接时一次,运行时一次。
动态库删除后,生成的可执行文件对应的也不能执行;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值