【问题标题】:Static library & Dynamic library : Confusion静态库和动态库:混淆
【发布时间】:2011-01-15 20:24:43
【问题描述】:

在这方面我需要一点说明。我觉得Static libraryDynamic Library这两个词都不对。

  • lib1.o + lib2.o + lib3.o --> “LinkerOutputFile”(可执行文件或库)。
  • 如果此“LinkerOutputFile”包含所有文件 lib1.o、lib2.o、lib3.o 的代码,则表示“LinkerOutputFile”是静态链接的“LinkerOutputFile”(可执行文件或库)。 (或)

  • 如果“LinkerOutputFile”仅包含对 lib1.o、lib2.o、lib3.o 的引用和关于的其他信息,而不包含这些 lib*.o 文件的代码。然后它说“LinkerOutputFile”是动态链接的。

这如何使 lib*.o 文件成为静态库或动态库?它们只是库文件。

或者,“LinkerOutputFile”是一个库而不是可执行文件,这取决于它是静态链接的还是动态链接的,称为静态库还是动态库。对还是错?

我知道我错了,因为,我知道

在大多数 unix 风格的平台上 扩展是

  • .a 用于静态库(存档)和
  • .so 用于共享库。

在 Windows 上:

  • .dll 表示共享库
  • .lib 表示静态或导入库。

但无法弄清楚我错在哪里。另外请告诉我Static libraryDynamic Library 内部有何不同。

另外,这是来自 ABI 规范:

本章描述目标文件 格式,称为 ELF(可执行和 链接格式)。主要有三个 目标文件的类型。

可重定位文件保存代码和数据 适合与其他对象链接 文件来创建可执行文件或 共享对象文件。

一个可执行文件包含一个程序 适合执行;文件 指定 exec(BA_OS) 如何创建 程序的进程映像。

共享对象文件包含代码和 适合链接成两个的数据 上下文。一、链接编辑器[见 ld(BA_OS)] 处理共享对象 与其他可重定位和共享的文件 对象文件以创建另一个对象 文件。二、动态链接器 将其与可执行文件结合起来 和其他共享对象创建一个 过程映像。

“共享对象文件”是动态库(具有 *.so 扩展名)的另一种说法。但是“静态库”呢?这个连提都不提了。

“可重定位”、“静态库”和“导入库”之间有什么区别吗?请用内部结构澄清一下。

【问题讨论】:

标签: linker shared-libraries static-libraries


【解决方案1】:

.o 文件不是任何类型的库文件。它们是一个object文件。

.a/.lib 文件在构建时链接。事后无法更换它们。这使它们成为静态的。

.so/.dll 文件在运行时链接。它们可以在执行开始之前随时更换。这使它们充满活力。

重定位是指在内存中放置一个二进制文件;静态库中的代码与二进制文件集成在一起,因此不能独立重定位。

【讨论】:

    【解决方案2】:

    静态库包含复制到可执行文件中的代码。程序未引用的库中的代码将被删除。只有静态库的程序在运行时没有任何依赖关系。

    动态库在运行时链接——引用动态库的程序将在启动时(或按需)加载并链接到该库。

    可重定位库是动态库的另一种说法。当您与动态库链接时,会根据库在内存中的加载位置计算其中包含的函数的地址。它们是“可重定位的”,因为包含函数的地址不是在链接时确定的。 (在静态库中,地址是在链接时计算的。)

    目标文件 (.o) 包含编译后的代码,但不包含所有函数的最终地址。链接是链接器遍历所有目标文件并为每个调用的函数计算正确地址的过程。

    【讨论】:

      【解决方案3】:

      假设我的 AppStaticLib.lib 链接,然后是我的 AppStaticLib 中的所有代码.lib 将在同一个可执行文件中。这意味着 StaticLib.h 包含函数实现。

      现在,如果我将 AppDynamicLib.lib 链接,那么我的 App 将使用 DynamicLib.dll 中实现的函数strong> 这意味着 DynamicLib.lib 包含引用,例如:

      • OpenWAV 位于 DynamicLib.dll 的偏移量 1 处
      • DynamicLib.dll 的偏移量 2 处找到 CloseWAV 等等

      Dynamic这个名字的意思是任何App都可以加载,并不是真的和DynamicLib.lib链接,而是调用LoadLibrary(),手动导入DLL导出的函数。

      关于可重定位,目前我对这个词并不熟悉。

      我是以 Windows 程序员的身份说话,所以我不知道 Linux 上到底发生了什么,但从名称来看,SO(共享对象)与 DLL 相同。

      希望我的回答对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多