目录
前言
一.静态库
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.outadd(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)。
- 编译:将源代码(如C或C++代码)编译成目标文件(通常是
.o
文件)。- 链接:将目标文件与库文件链接在一起,生成最终的可执行文件。
对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。
四.如何创建和管理库
创建静态库和动态库通常涉及到使用编译器(如GCC)的特定选项。
例如,创建动态库时,你可能需要使用
-shared
选项,而创建静态库则不需要。管理库通常涉及到使用
ldconfig
命令,它可以更新系统的库缓存,确保ld.so
(动态链接器)能够找到并加载正确的库文件。
五.总结
静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。
静态库适合于不需要频繁更新和分发简单的应用程序,而动态库则更适合于需要节省空间、易于更新和维护的大型应用程序。
在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。