库文件|静态库、共享库区别

本文介绍了库文件,即预先编译好的方法集合,标准库文件存放位置。详细说明了静态库和共享库的创建、使用方法,如静态库需先编译成.o文件再打包,共享库用特定命令生成。还指出动态库加载出错原因及解决办法,最后对比了两者在链接、体积、更新等方面的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库文件:预先编译好的方法(函数)的集合
标准库文件一般存放在/lib或/usr/lib中,声明.h文件放在/user/include中。
库文件类型

类型静态库共享库
Windows.lib.dll
Linux.a.so

ldd 查看某个程序的共享库依赖

静态库 libxxx.a
1、将.c文件编译成.o文件(不包括main函数的文件);
2、打包做出库,命令:ar crv libxxx.a *.o
3、使用:gcc -o main main.c -L -lxxx在这里插入图片描述
注意:可以把自己的库放到/usr/lib下(切换root用户),使用时就不用加库的路径了。

共享库 libxxx.so
1、生成共享库 gcc -shared -fPIC -o libmyfoo.so *.c
2、使用:gcc -o main main.c -L. -lxxx

-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190520203952992.png
出错的原因:-L -l仅仅给gcc指明了库的路径和名称,操作系统单独加载动态库时还需要知道库的路径。
程序执行时,使得操作系统加载动态库的方法:

  1. 将动态库拷贝到默认的/usr/lib或/lib下,只有root用户执行。
  2. 设置环境变量LD_LIBRARY_PATH,使得操作系统加载库时,除了在默认路径下搜索,还需要到用户指定的路径下搜索。设置LD_LIBRARY_PATH的方法:
    (1)直接在终端上操作, export LD_LIBRARY_PATH=绝对路径,仅对当前终端有效
    (2)直接修改配置文件,expotr LD_LIBRARY_PATH=/home/stu/lib,对任意终端有效。

静态库和共享库区别
1、使用静态库,在链接阶段直接将库中的内容合并到最终的可执行文件中;
使用共享库,在链接阶段只在可执行文件中设置使用的库,运行时有操作系统动态加载到内存上,所以执行速度比共享库要快一点。
2、静态库链接生成的可执行文件体积较大,且包含相同的公共代码,造成内存浪费;
共享库显著减少应用程序可执行文件占用的硬盘空间。
3、静态库文件的更新不会反映到应用程序中,需要重新编译新的静态库;
共享库能够在任何时候更新(修复bug,增加新的功能),并且能够被反映到应用程序中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值