在链接打包中我们分开处理了各个文件,读取了一组可重定位文件,并把他们链接起来,形成一个输出的可执行文件,比如之前的 sum.omain.o,这引出了我们如何管理文件和模块之间的关系

  • 选择 1:将所有函数都放入一个源文件中
    • 程序员将大目标文件链接到他们的程序中
    • 时间和空间效率低下
  • 选择 2:将每个函数放在一个单独的源文件中
    • 程序员明确地将适当的二进制文件链接到他们的程序中
    • 更高效,但对程序员来说是负担

传统的解决方案是使用静态库(.a 存档文件)

  • 存档文件
    • 将相关的可重定位目标文件连接到一个带有索引的单个文件中(叫做存档文件)
  • 增强链接器,使它尝试通过查找一个或多个存档文件中的符号来解决未解析的外部引用
  • 如果一个存档成员文件.o 解析了符号引用,就把它链接入可执行文件

也就是说我们可以把所有相关的目标模块打包成为一个单独的文件,这也就是静态库,它可以用做链接器的输入
当链接器构造一个输出的可执行文件时,它只复制静态库里被应用程序引用的目标模块
静态库概念被提出来,相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件
应用程序可以通过在命令行上指定单独的文件名字来使用这些在库中定义的函数
在链接时,链接器将只复制被程序引用的目标模块,这就减少了可执行文件在磁盘和内存中的大小

存档
Linux 系统中,静态库以一种称为存档(archive)的特殊文件格式存放在磁盘中
存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。存档文件名由后缀 .a 标识