静态库和动态库:混乱

pec*_*ker 6 linker shared-libraries static-libraries

我在这方面几乎无需澄清.我觉得条款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扩展名)的其他词.但是"静态库"怎么样?这甚至没有提到它.

"可重定位"和"静态库"和"导入库"之间有什么区别吗?请用内部结构澄清我.

Ign*_*ams 10

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

.a/ .libfiles在构建时链接.事后他们不能被替换.这使它们变得静止.

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

重定位是指在内存中放置二进制文件; 静态库中的代码与二进制文件集成,因此无法独立重定位.


Dr.*_*tix 0

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

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

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

名称dynamic意味着它可以被任何App加载,并不是真正通过与DynamicLib.lib链接,而是调用LoadLibrary ()并手动导入DLL导出的函数。

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

我是作为一名 Windows 程序员来谈论的,所以我不知道 Linux 上到底发生了什么,但从名称来看,SO(共享对象)与 DLL 是一样的。

希望我的回答有帮助!