2010-02-11 206 views
6

我在这方面需要一点澄清。我觉得条款Static library & Dynamic 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 library & Dynamic Library内部不同。

此外,这是从ABI规格:

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

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

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

共享对象文件保存代码和数据 适于两个 上下文进行链接。首先,链接编辑器[请参阅 ld(BA_OS)]处理共享对象 文件与其他可重定位和共享的 对象文件,以创建另一个对象 文件。其次,动态链接器 将其与可执行文件 和其他共享对象组合以创建过程映像。

“共享对象文件”是用于说动态库(具有* .so扩展名)的其他词。但是“静态库”呢?这甚至没有提到它。

“可重定位”&“静态库”&“导入库”是否有区别?请以内部结构说明我。

+0

请注意,用于静态和动态链接的'.o'文件不同(请参阅'-static'选项的gcc参考)。您的问题的答案在这里:http://stackoverflow.com/questions/1210787/relation-between-object-file-and-shared-object-file/1210857#1210857 – 2010-10-02 13:18:09

+0

可能重复的[静态和共享库之间的差异?](http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries) – 2012-04-06 05:31:09

回答

0

比方说,我有我的应用StaticLib.lib链接,然后从我的两个应用StaticLib.lib所有代码都将在同一个可执行文件。这意味着StaticLib.h 包含其中的函数实现。

现在,如果我链接应用DynamicLib.lib,然后我应用将使用DynamicLib.dll实现的功能就意味着DynamicLib.lib constains引用,是这样的:

  • OpenWAV位于偏移量1处DynamicLib.dll
  • CloseWAV位于偏移量2处在DynamicLib.dll

名称动态意味着它可以被任何应用程序被加载,而不是真的用DynamicLib.lib联,但调用LoadLibrary(),并导入由DLL导出函数手。

关于Relocatable,在这一刻我不熟悉这个词。

我说的是Windows程序员,所以我不会在Linux上真正发生什么,但从名称SO(Shared Objects)来看,它们与DLL一样。

希望我的回答很有帮助!

10

.o文件不是任何类库文件。它们是对象文件。

.a/.lib文件在构建时链接。在事实之后它们不能被替换。这使得它们是静态的。

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

搬迁是指在存储器中放置一个二进制文件;来自静态库的代码与二进制文件集成,因此不能独立重新定位。

4

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

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

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

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