【发布时间】:2011-01-15 20:24:43
【问题描述】:
在这方面我需要一点说明。我觉得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 扩展名)的另一种说法。但是“静态库”呢?这个连提都不提了。
“可重定位”、“静态库”和“导入库”之间有什么区别吗?请用内部结构澄清一下。
【问题讨论】:
-
请注意,用于静态和动态链接的
.o文件不同(请参阅 gcc 参考以了解-static选项)。您的问题的答案在这里:stackoverflow.com/questions/1210787/…
标签: linker shared-libraries static-libraries