链接器如何操作静态库

image.png

总结:

1.一个静态界面库:libwidget.a 由如下表的 {方块.o,园.o,三角形.0} 文件编译而成:

界面 编译文件 函数API
方块 方块.o get1()
园.o get2()
三角形 三角形.o get3()
  1. 一个main.c 链接了静态库 libwidget.a, 使用了 get1() 来获取方块的界面

链接器操作步骤

gcc -static main.c -L libwidget.a -> 在链接之前main.c 已为 main.o

集合
E(放可重入的目标文件->最后整合所有元素->可执行目标文件)
U(放未定义的符号)
D(放定义的符号)

#######################################################################
#######################################################################

链接器
1. 输入文件:存档文件libwidget.a、 可重入目标文件 main.0
2. 处理可重入目标文件main.o,将main.o放入集合E,将其未定义的符号放入U,定义的放入D
3. 处理libwidget.a这个存档文件,顺序的一个个解析静态库存档文件集合中每个xxx.o,若出现U中符号的定义,则去除U中的未定义,并把定义放入D,最后将此 xxx.o 放入E,直到所有文件解析结束
4. 查看集合U中是否为空, 空 ——> 正确 ——> 将E中所有元素整合成可执行目标文件; 不空——>保持终止运行——>常见的 undefine reference to xxx

注意: 命令行的输入顺序,应先写main.c 即引用了库函数的模块,不然先写库模块的话,因为对于链接器来说库模块是存档文件,最开始U是空的,没有未定义的符号,链接器不会把 main.c 需要的模块符号放入U,也不会把库的每个 .o 放入 E。

你可能感兴趣的:(链接器如何操作静态库)