openSUSE:静态库打包策略
包含库的软件包通常应尽可能排除静态库。 这通常可以通过使用 --disable-static 选项配置构建系统来实现。 静态库的包含应仅限于没有可行替代方案的特殊情况。
链接到库的应用程序,在可行的情况下,应使用共享库而不是静态库。
Libtool 存档
Libtool 存档文件,通常命名为 foo.la,不应包含在软件包中。 使用 libtool 时,即使构建配置为 --disable-static,这些文件也会默认安装。 因此,在打包之前可能需要显式删除它们。
由于旧版本的 libtool 或使用它的程序中的错误,有时无法在不修改源代码的情况下安全地删除 *.la 文件。 然而,在许多情况下,与上游维护者合作解决这些问题是可行的。
*.la 文件,则删除它们应被视为 API/ABI 更改。 删除它们会改变库呈现给其他软件的接口,因此应谨慎对待。例外
能够跟踪哪些软件包使用静态库非常重要,例如,为了确定如果静态库中的安全漏洞得到修复,哪些软件包需要重新构建。
如果您真的需要打包静态库,则必须遵守以下准则。
静态库必须放置在 *-devel-static 子软件包中,该子软件包必须 Requires 相应的 *-devel 子软件包。 这种分离允许通过识别哪些软件包 BuildRequire *-devel-static 软件包来跟踪静态库的使用情况。 总体意图是鼓励尽可能从静态库迁移到共享库。
当一个软件包仅提供静态库时,可以省略对 *-devel 子软件包的 Requires,假设 *-devel-static 子软件包包含必要的头文件。 显式需要链接到静态版本的软件包,则必须包含 BuildRequires: foo-devel-static,从而启用使用情况跟踪。
如果(且仅当)一个软件包包含共享库,而这些共享库需要静态库才能正常工作,则静态库可以包含在 *-devel 子软件包中。 在这种情况下,*-devel 子软件包必须提供一个虚拟的 Provides: *-devel-static,并且依赖于它的任何软件包仍然必须 BuildRequire *-devel-static 软件包。