Linux【动态库与静态库】

本文详细解析了静态库(.a)与动态库(.so)在编译链接阶段的区别,静态库在编译时将代码链接到可执行文件,而动态库在运行时才链接。介绍了静态库与动态库的生成步骤,包括使用gcc和ar命令,并讨论了它们在资源消耗和更新方面的优劣。

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

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中
动态库(.so):程序在运行的时候才链接动态库中的代码,多个程序共享使用库的代码

静态库的生成(这里以基本运算为例):
1.先创建四个.h .c文件,分别声明和定义加减乘除基本运算函数
2.使用gcc将.c文件生成.o文件,例:gcc -c add.c -o add.o
3.使用命令将四个文件链接起来生成静态库,ar -rc libmylib.a add.o sub.o mul.o div.o
4.使用命令gcc main.c -L . -lmylib 链接静态库并生成可执行文件a.out

  • ar:静态库生成链接器
  • -r:replace,代表模块替换
  • -c:create,代表创建
  • 库名规则:lib+库名+.a
  • -L:指定库路径
  • -l:指定库名
  • -t:列出静态库中的文件
  • -v:verbose详细信息

库搜索路径:

  • 从左到右搜索-L指定的目录
  • 由环境变量指定的目录
  • 由系统指定的目录:/usr/lib或者/usr/local

在这里插入图片描述
在这里插入图片描述
删除了静态库之后,a.out仍然可以执行,这也就证明了静态库是在程序编译链接的时候就将库里的代码链接到可执行文件中,也就是将库里的代码拷贝了一份在程序中,这也就造成了空间上的浪费,而且库文件一旦修改或更新了,可执行程序就需要重新编译

动态库的生成:

  • shared:表示生成共享库格式
  • -fPIC:产生位置无关码
  • 库名规则:lib+库名+.so
    – l:链接动态库
  • -L:链接库所在的路径

1.使用gcc -fPIC -c add.c sub.c mul.c div.c 生成位置无关码
2.使用gcc -shared -o libmylib.so *.o(匹配当前目录下的所有.o文件)生成动态库
3.使用gcc main.c -o main -L . -lmylib链接动态库并生成可执行文件main
在这里插入图片描述
在这里插入图片描述
删除动态库之后,执行可执行文件main就会报错,这也就说明动态库是程序执行使才链接到库里的代码

运行动态库:

  1. 拷贝.so文件到系统共享库路径下,一般是/usr/lib
  2. 更改LD_LIBRARY_PATH
  3. idconfig配置/etc/id.so.conf.d/,idconfig更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值