Linux 动态库与静态库技术详解
一、库的基本概念
什么是库?
库是预先编译好的代码集合,包含可重复使用的函数、类或资源,可以被多个程序共享使用。
库的两种主要形式:
- 静态库:在编译时被完整地链接到可执行文件中
- 动态库:在程序运行时才被加载到内存中
二、静态库(Static Libraries)
1. 工作原理
+-------------------+ +-----------------+
| 你的源代码 | | 编译器 |
| (main.c) | | |
+-------------------+ +-----------------+
v
+-------------------+ +-----------------+
| 静态库 | | 链接器 |
| (libmath.a) | | (静态链接) |
+-------------------+ +-----------------+
v
+-------------------+ +-----------------+
| 独立的可执行文件 | | 包含库代码的 |
| (program) | | 完整副本 |
+-------------------+ +-----------------+
2. 创建和使用静态库
步骤 1:编译源文件为目标文件
gcc -c add.c -o add.o
gcc -c subtract.c -o subtract.o
步骤 2:创建静态库
# 使用 ar 命令创建静态库
ar rcs libmath.a add.o subtract.o
# 命令解释:
# ar - 归档工具
# r - 替换或添加文件到归档
# c - 创建归档(如果不存在)
# s - 创建索引
步骤 3:使用静态库
gcc main.c -L. -lmath -o program
# -L. 指定库搜索路径(当前目录)
# -lmath 链接名为 libmath.a 的库
三、动态库(Shared Libraries)
1. 工作原理
+-------------------+ +-----------------+
| 你的程序 | | 动态库 |
| (program) | | (libmath.so) |
+-------------------+ +-----------------+
|
v
+--------->+<--------------+
| 运行时加载|
+---------------+
| 内存中 |
| 共享的库代码 |
+---------------+
2. 创建和使用动态库
步骤 1:编译位置无关代码
# -fPIC 生成位置无关代码(Position Independent Code)
gcc -c -fPIC add.c -o add.o
gcc -c -fPIC subtract.c -o subtract.o


