2024/02/22 14:45:04
为什么 SDK 中使用的是动态库而不是静态库?
声网实时互动 SDK 的早期版本在部分平台提供静态库,但在实际使用过程中,我们发现使用静态库存在以下问题:
-
编译冲突:静态库可能造成第三方库之间出现符号冲突。例如,如果你的 App 和声网 SDK 一样使用了
ffmpeg
库,那么使用静态库必然存在符号冲突,导致 App 编译失败。 -
兼容性问题:如果你的 App 和声网使用的第三方库版本不一致,有概率导致 App 崩溃。
-
合规问题:声网实时互动 SDK 使用了一些开源协议的库,如
ffmpeg
库。根据开源协议要求,如果 SDK 是以静态库形式提供,开源协议会扩散到你的 App,意味着你的 App 也必须开源。为了符合开源协议规范,我们只能使用动态库。
为了解决上述问题,同时也为了顺应 RTC 行业普遍使用动态库的趋势,声网实时互动 SDK 全平台仅提供动态库。
参考信息
静态库和动态库的区别
动态库(Dynamic Link Library,DLL)和静态库(Static Library)是两种不同的库文件,用于在编程中组织和共享代码。它们之间的主要区别在于链接的时机和方式。
对比项 | 静态库 | 动态库 |
---|---|---|
链接时机 | 在编译时将库的代码和程序的代码合并在一起,形成一个独立的可执行文件。 | 在编译时不会将库的代码合并到可执行文件中,而是在运行时动态加载。 |
空间占用 | 会增加可执行文件的大小,因为库的代码被完全复制到可执行文件中,因此占用更多的磁盘空间。 | 可执行文件的大小相对较小,因为它只包含对动态库的引用,而不包含实际代码,可节省磁盘空间。 |
运行效率 | 在编译时已经链接到可执行文件,因此在运行时不需要额外的加载步骤,程序启动速度可能会更快。 | 在运行时需要动态加载,操作系统会在程序启动时或在需要时将动态库加载到内存中,因此程序启动速度可能会稍慢,但程序运行时可以节省内存空间。 |
更新和维护 | 库更新后,需要重新编译程序以使用新版本的库。 | 库更新后,仅需要更新动态库文件,无需重新编译。 |
共享性 | 代码被静态复制,因此每个使用该库的程序都有自己的一份库的副本。 | 多个程序可以共享同一份动态库的实例,因为动态库在内存中只有一份。 |