so和.a文件
so 文件和 a 文件都是用于共享代码库的文件格式,但它们在使用和行为上有显著的区别。
so 文件(Shared Object)
- 全称:Shared Object
- 平台:主要用于类 Unix 系统(如 Linux、Android)。
- 用途:共享库文件,用于动态链接。
- 加载时间:在运行时动态加载。
- 文件大小:相对较小,因为多个程序可以共享同一份库文件。
- 更新方式:更新库文件不需要重新编译依赖此库的应用程序。
- 符号表:包含所有导出符号的信息,允许其他应用程序和库在运行时解析这些符号。
优点:
- 内存共享:多个进程可以共享同一个库的单个副本,节省内存。
- 动态链接:可以在运行时替换库文件,方便升级和修补。
- 节省磁盘空间:同一份库文件可以被多个应用程序使用,减少磁盘空间占用。
缺点:
- 加载时间:加载共享库会稍微增加启动时间,因为需要在运行时解析符号。
- 依赖问题:如果共享库版本不兼容,可能会导致运行时错误。
a 文件(Static Library)
- 全称:Archive
- 平台:跨平台(如 Unix、Windows)。
- 用途:静态库文件,用于静态链接。
- 加载时间:在编译时链接到应用程序的可执行文件中。
- 文件大小:相对较大,因为每个使用静态库的程序都包含一份完整的库代码。
- 更新方式:更新库文件后需要重新编译所有依赖此库的应用程序。
- 符号表:包含所有定义符号的信息,但在链接时将符号复制到可执行文件中。
优点:
- 独立性:生成的可执行文件独立,不依赖外部库文件,便于分发。
- 性能:由于所有代码在编译时已链接,运行时性能稍优,启动速度较快。
缺点:
- 文件大小:可执行文件包含所有库代码,导致文件较大。
- 更新不便:更新静态库后需要重新编译所有依赖的应用程序。
使用场景
- Shared Object (so) 文件:
- 适用于需要频繁更新或修补的库。
- 适用于内存受限的环境,多个应用程序可以共享库代码。
- 适用于大型应用程序,减少磁盘空间占用。
- Static Library (a) 文件:
- 适用于无需频繁更新的库。
- 适用于独立的应用程序,便于分发和使用。
- 适用于性能要求高的应用程序,减少运行时链接开销。
具体示例
- android中会将c++代码打成so文件 所以后续如果其他项目要用 可以直接分享so文件