Linker 静态库&;动态库:混乱

Linker 静态库&;动态库:混乱,linker,shared-libraries,static-libraries,Linker,Shared Libraries,Static Libraries,在这方面我不需要什么澄清。我觉得术语静态库和动态库不正确 lib1.o+lib2.o+lib3.o-->“LinkedRoutPutFile”(可执行文件或库) 如果此“LinkedRoutPutFile”包含所有文件lib1.o、lib2.o、lib3.o的代码,则其表示“LinkedRoutPutFile”以讽刺方式链接到“LinkedRoutPutFile”(可执行文件或库)。(或) 如果“LinkedRoutPutFile”只包含对lib1.o、lib2.o、lib3.o的引用和其他信

在这方面我不需要什么澄清。我觉得术语
静态库
动态库
不正确

  • lib1.o+lib2.o+lib3.o-->“LinkedRoutPutFile”(可执行文件或库)
  • 如果此“LinkedRoutPutFile”包含所有文件lib1.o、lib2.o、lib3.o的代码,则其表示“LinkedRoutPutFile”以讽刺方式链接到“LinkedRoutPutFile”(可执行文件或库)。(或)

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

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

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

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

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

  • .a用于静态库(存档)和
  • .so用于共享库
在Windows上:

  • .dll表示共享库
  • .lib表示静态或导入库
但我不知道我错在哪里。另外,请告诉我
静态库
动态库
的内部区别

此外,这来自ABI规范:

本章介绍对象文件 格式,称为ELF(可执行文件和 链接格式)。主要有三点 对象文件的类型

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

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

共享对象文件保存代码和 适合在两个数据库中链接的数据 上下文。首先,链接编辑器[参见 ld(BA_OS)]处理共享对象 与其他可重新定位和共享的 对象文件以创建另一个对象 文件第二,动态链接器 将其与可执行文件组合 和其他共享对象来创建 处理图像

“共享对象文件”是表示动态库(具有*.so扩展名)的另一个词。但是“静态库”呢?这甚至没有提到


“可重定位”与“静态库”与“导入库”之间有什么区别吗?请澄清我的内部结构。

假设我的应用程序链接到StaticLib.lib,那么我的应用程序和StaticLib.lib中的所有代码都将在同一个可执行文件中。这意味着StaticLib.h 包含其中的函数实现

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

  • OpenWAV位于DynamicLib.dll中的偏移量1处
  • CloseWAV位于DynamicLib.dll中的偏移量2处 等
名称dynamic意味着它可以被任何应用程序加载,实际上不是通过链接DynamicLib.lib,而是调用()并手动导入DLL导出的函数

关于可迁移,目前我对这个词不太熟悉

我是以Windows程序员的身份发言的,所以我不知道Linux上到底发生了什么,但从名称来看,so(共享对象)与DLL是一样的


希望我的回答有帮助

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

.a
/
.lib
文件在生成时链接。事后不能更换。这使得它们是静态的

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


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

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

动态库是在运行时链接的——带有动态库引用的程序将在启动(或按需)时加载并与库链接

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


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

请注意,用于静态链接和动态链接的
.o
文件不同(请参阅gcc参考以了解
-static
选项)。你的问题的答案是:可能重复的