静态库:源代码的重新编译和共享

静态库:源代码的重新编译和共享

我试图了解 Linux 中静态库和共享库的创建和使用程序库指南。链接中有两句话我很困惑:

  1. 静态库允许用户链接到程序而无需重新编译其代码,从而节省了重新编译时间。
  1. 如果开发人员希望允许程序员链接到他们的库,但又不想提供库源代码,则静态库通常对开发人员很有用。

关于1:静态库最终作为可执行文件的一部分,而共享库保持独立,并且仅在可执行文件开始执行时才加载。但是,这两个库是否都具有当新应用程序想要使用它们时不必重新编译的优点 - 假设库本身没有更改?如果这是真的,为什么该声明给人的印象是静态库相对于共享库的优势?

关于2:再说一次,这不是也适用于共享库吗?共享库也使用目标文件,尽管它们是以架构特定的格式生成为 PIC 的。那么,在这种情况下,源代码是否被共享?

答案1

我认为应该按照指南的呈现顺序来理解该指南,而不需要假设有关图书馆的外部知识。因此在第 2 章,“静态库”,比较不涉及共享库,目前还没有介绍。

因此,两个摘录都只是与源代码的比较:与提供源代码相比,构建静态库允许重新使用编译对象而无需重新编译,甚至无需提供其源代码。

答案2

摘录内容不清楚。

静态库成为可执行文件的一部分,并且在该可执行文件之外不可用。看man ld。它们就像外部函数一样被对待。静态链接的可执行文件比动态链接的可执行文件大,但它们是完整的。自给自足。

当使用动态链接库时,程序提供库名称。所需的版本等。请参阅man elf readelf 当程序加载时ld.so(请参阅man ld.so),动态链接库将映射到任务的内存中(请参阅man mmap),并设置一个间接调用表,以便程序可以访问该库。动态链接库让系统在所有任务之间共享 1 个 RAM 中的库副本。动态库的使用使可执行文件更小,并将库的更新委托给系统管理员。但是,如果所需的库和版本不可用,则在执行时解析库可能会失败。它们既不完整也不自足。

相关内容