image.png
总结:
1.一个静态界面库:libwidget.a 由如下表的 {方块.o,园.o,三角形.0} 文件编译而成:
界面 | 编译文件 | 函数API |
---|---|---|
方块 | 方块.o | get1() |
园 | 园.o | get2() |
三角形 | 三角形.o | get3() |
- 一个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 |