Linux——动态库和静态库

目录

前言

一.静态库

1.1生成静态库

1.2 库搜索路径

1.3 静态库优点

1.4 静态库缺点

二.动态库

2.1 生成动态库

2.2 使用动态库

2.3 运行动态库

2.4 动态库的优点

2.5  动态库的缺点

三.链接过程

四.如何创建和管理库

五.总结


前言

Linux系统中的库(Library)是一组可被多个程序共享的代码和数据的集合。库的主要目的是代码复用和模块化,它允许开发者在不同的程序中重复使用相同的代码,而不需要每次都重新编写。在Linux中,库主要分为两种类型:静态库(Static Libraries)动态库(Dynamic Libraries)。

一.静态库

  静态库在编译时被整合到最终的可执行文件中。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。静态库通常以.a(Archive)作为文件扩展名,例如libexample.a

1.1生成静态库

[root@localhost linux]# ls
add.c add.h main.c sub.c sub.h

[root@localhost linux]# gcc -c add.c -o add.o
[root@localhost linux]# gcc -c sub.c -o sub.o
生成静态库

[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表

[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息

[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。

1.2 库搜索路径

从左到右搜索-L指定的目录。
由环境变量指定的目录 (LIBRARY_PATH)
由系统指定的目录
/usr/lib
/usr/local/lib

1.3 静态库优点

  • 应用程序在运行时不依赖于库文件,因为代码已经被包含在内。
  • 通常在没有动态库支持的环境中(如某些嵌入式系统)更容易使用。
  • 程序的分发更为简单,因为不需要附带额外的库文件。

1.4 静态库缺点

  • 静态库的代码会被复制到每个使用它的程序中,这可能导致磁盘空间和内存的浪费。
  • 更新静态库时,所有使用该库的程序都需要重新编译。

二.动态库

动态库在程序运行时被加载。与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。动态库通常以.so(Shared Object)作为文件扩展名,例如libexample.so

2.1 生成动态库

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so

[root@localhost linux]# gcc -fPIC -c sub.c add.c 

[root@localhost linux]# gcc -shared -o libmymath.so *.o 

[root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o

2.2 使用动态库

编译选项
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.

gcc main.o -o main –L. -lhello

2.3 运行动态库

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改 LD_LIBRARY_PATH

[root@localhost linux]# export LD_LIBRARY_PATH=.

[root@localhost linux]# gcc main.c -lmymath

[root@localhost linux]# ./a.out

add(10, 20)=30
sub(100, 20)=80

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf

/root/tools/linux

[root@localhost linux]# ldconfig

2.4 动态库的优点

  • 节省磁盘空间和内存,因为多个程序可以共享同一份库文件。
  • 更新动态库时,只需替换库文件本身,而不需要重新编译所有依赖它的程序。
  • 动态链接可以在运行时解决库的版本冲突问题。

2.5  动态库的缺点

  • 程序在运行时需要库文件,这意味着分发时需要确保库文件的存在。
  • 如果库文件损坏或者不兼容,程序可能无法运行。

三.链接过程

在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。

  1. 编译:将源代码(如C或C++代码)编译成目标文件(通常是.o文件)。
  2. 链接:将目标文件与库文件链接在一起,生成最终的可执行文件。

对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。

四.如何创建和管理库

创建静态库和动态库通常涉及到使用编译器(如GCC)的特定选项。

例如,创建动态库时,你可能需要使用-shared选项,而创建静态库则不需要。

管理库通常涉及到使用ldconfig命令,它可以更新系统的库缓存,确保ld.so(动态链接器)能够找到并加载正确的库文件。

五.总结

静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。

静态库适合于不需要频繁更新和分发简单的应用程序,而动态库则更适合于需要节省空间、易于更新和维护的大型应用程序。

在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值