当前位置:首页 > 系统教程 > 正文

Linux动静态库详解 (从零开始掌握库的创建与使用)

Linux动静态库详解 (从零开始掌握库的创建与使用)

Linux动静态库详解 (从零开始掌握库的创建与使用) 静态库 动态库 链接 共享库 第1张

在Linux系统编程中,是一种重要的代码复用方式。库分为静态库动态库(也称为共享库)。本文将详细介绍两者的区别、创建方法及使用技巧,帮助小白快速入门。

一、什么是库?

库是预先编译好的函数集合,可供其他程序调用。使用库可以避免重复编译相同代码,便于模块化开发。Linux中库文件命名通常以"lib"开头,静态库后缀为.a,动态库后缀为.so

二、静态库

静态库(.a)在程序编译链接时,会将库代码直接拷贝到可执行文件中。生成的可执行文件较大,但运行时不再依赖库文件。

1. 创建静态库

假设我们有源文件add.csub.c,头文件math.h。首先编译成目标文件:

gcc -c add.c sub.c

得到add.osub.o。然后使用ar命令打包:

ar rcs libmymath.a add.o sub.o

其中rcs选项表示创建库并插入目标文件。

2. 使用静态库

编译主程序main.c时,链接静态库:

gcc main.c -L. -lmymath -o main

-L.指定库搜索路径为当前目录,-lmymath链接libmymath.a

3. 静态库优缺点

优点:部署简单,运行时无需库文件;缺点:浪费磁盘和内存空间,库更新需重新编译程序。

三、动态库

动态库(.so)在程序运行时动态加载,多个程序可共享同一份库代码,节省资源。

1. 创建动态库

同样使用add.csub.c,编译时添加-fPIC生成位置无关代码,然后创建共享库:

gcc -fPIC -c add.c sub.cgcc -shared -o libmymath.so add.o sub.o

2. 使用动态库

编译主程序:

gcc main.c -L. -lmymath -o main

运行时需要将动态库路径加入LD_LIBRARY_PATH或系统库路径,例如:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH./main

3. 动态库优缺点

优点:节省内存和磁盘空间,库更新无需重新编译程序;缺点:运行时依赖库文件,部署稍复杂。

四、静态库与动态库对比

特性静态库动态库
链接方式编译时链接运行时链接
文件大小可执行文件大可执行文件小
内存占用每个进程一份多进程共享一份
更新需重新编译替换so文件即可

五、库搜索路径

链接器默认搜索/lib/usr/lib等系统路径,也可通过-L指定。动态库运行时搜索路径包括:LD_LIBRARY_PATH、缓存文件/etc/ld.so.cache、默认系统路径。

总结:掌握静态库动态库的创建与使用是Linux编程的基础。希望通过本文,你对链接过程和共享库有了清晰的认识。