Skip to main content

so和.a文件

so 文件和 a 文件都是用于共享代码库的文件格式,但它们在使用和行为上有显著的区别。

so 文件(Shared Object)

  • 全称:Shared Object
  • 平台:主要用于类 Unix 系统(如 Linux、Android)。
  • 用途:共享库文件,用于动态链接。
  • 加载时间:在运行时动态加载。
  • 文件大小:相对较小,因为多个程序可以共享同一份库文件。
  • 更新方式:更新库文件不需要重新编译依赖此库的应用程序。
  • 符号表:包含所有导出符号的信息,允许其他应用程序和库在运行时解析这些符号。

优点:

  1. 内存共享:多个进程可以共享同一个库的单个副本,节省内存。
  2. 动态链接:可以在运行时替换库文件,方便升级和修补。
  3. 节省磁盘空间:同一份库文件可以被多个应用程序使用,减少磁盘空间占用。

缺点:

  1. 加载时间:加载共享库会稍微增加启动时间,因为需要在运行时解析符号。
  2. 依赖问题:如果共享库版本不兼容,可能会导致运行时错误。

a 文件(Static Library)

  • 全称:Archive
  • 平台:跨平台(如 Unix、Windows)。
  • 用途:静态库文件,用于静态链接。
  • 加载时间:在编译时链接到应用程序的可执行文件中。
  • 文件大小:相对较大,因为每个使用静态库的程序都包含一份完整的库代码。
  • 更新方式:更新库文件后需要重新编译所有依赖此库的应用程序。
  • 符号表:包含所有定义符号的信息,但在链接时将符号复制到可执行文件中。

优点:

  1. 独立性:生成的可执行文件独立,不依赖外部库文件,便于分发。
  2. 性能:由于所有代码在编译时已链接,运行时性能稍优,启动速度较快。

缺点:

  1. 文件大小:可执行文件包含所有库代码,导致文件较大。
  2. 更新不便:更新静态库后需要重新编译所有依赖的应用程序。

使用场景

  • Shared Object (so) 文件:
  • 适用于需要频繁更新或修补的库。
  • 适用于内存受限的环境,多个应用程序可以共享库代码。
  • 适用于大型应用程序,减少磁盘空间占用。
  • Static Library (a) 文件:
  • 适用于无需频繁更新的库。
  • 适用于独立的应用程序,便于分发和使用。
  • 适用于性能要求高的应用程序,减少运行时链接开销。

具体示例

  • android中会将c++代码打成so文件 所以后续如果其他项目要用 可以直接分享so文件