静态库,静态链接的动态库和动态链接的动态库的.lib文件内部是什么?


82

静态库,静态链接的动态库和动态链接的动态库的.lib文件内部是什么?

因此,在动态链接的动态库中不需要.lib文件,在静态链接中也不需要.lib文件,只是具有所有方法的.obj文件。那是对的吗?


4
可以注意到,问题是关于MS Windows平台的。
cubuspl42

Answers:


144

对于静态库,.lib文件包含该库的所有代码和数据。然后,链接器将标识所需的位并将其放入最终的可执行文件中。

对于动态库,.lib文件包含从库中导出的函数和数据元素的列表,以及有关它们来自哪个DLL的信息。链接器生成最终的可执行文件时,如果使用库中的任何功能或数据元素,则链接器将添加对DLL的引用(导致Windows会自动加载它),并将条目添加到可执行文件的导入表中,这样该函数的调用被重定向到该DLL。

您不需要.lib文件即可使用动态库,但是如果没有动态库,则无法将DLL中的函数视为代码中的常规函数​​。相反,您必须手动调用LoadLibrary以加载DLL(FreeLibrary完成后),并GetProcAddress获取DLL中的函数或数据项的地址。然后,您必须将返回的地址转换为适当的函数指针,才能使用它。


4
经过长时间的搜索,IMO,使用lib&dll的原因得到了最佳答案。谢谢
Jeet 2016年

@Anthony Williams,当您说:“对于动态库,.lib文件包含该库中导出的函数和数据元素的列表,以及有关它们来自哪个DLL的信息。”就是那个名为“ import”的.lib文件。库”与普通.lib文件(“静态库”)不同?
凌晨

是的,这是一个导入库
Anthony Williams

13

我发现汉斯的以下回答在这里也很有用。它清除了可能存在两种类型的lib文件的信息。

LIB文件用于构建您的程序,它仅存在于您的构建计算机上,并且您不发货。有两种。静态链接库是一袋.obj文件,它们被收集到一个文件中。链接器需要解析外部标识符时,会从文件中选择所有代码块。

但是与DLL更相关的是,LIB文件也可以是导入库。然后,它是一个简单的小文件,其中包含DLL的名称以及DLL导出的所有功能的列表。在构建使用DLL的程序时,需要将其提供给链接器,以便它知道外部标识符实际上是DLL导出的函数。链接器使用导入库将条目添加到EXE的导入表中。Windows随后在运行时使用它来确定需要加载哪些DLL才能运行该程序。


8

在静态库中,lib文件包含该库提供的功能的实际目标代码。在共享版本(您称为静态链接的动态库)中,只有足够的代码可以在运行时建立动态链接。

我不确定“动态链接的动态库”(以编程方式加载)。在这种情况下,您是否甚至还链接了.lib?

编辑:

来晚了一点,但是没有,您没有链接.lib。好吧,您链接到其中带有libraryloaderex的库。但是对于您正在使用的实际库,您可以通过C函数指针提供自己的绑定,并使用loadlibrary进行填充。

总结如下:

链接ǁ静态| DLL | 负载库
=========ǁ============== | ======================== ==================
API代码ǁ在您的com- | 在DLL中| 在DLL中
生活ǁ计划 |
---------ǁ----------------- || ---------------------- |- ------------------
功能ǁ直接,可以| 通过表间接| 通过您间接
通话ǁ被淘汰| 自动填充| 自己的功能
---------ǁ----------------- || ---------------------- |- ------------------
负担ǁ编译器| 编译器/操作系统| 您/操作系统

通过静态链接库,我的意思是使用.lib文件并在编译时链接.dll。动态链接是使用Win32 API的libraryloaderex()函数在运行时链接.dll。
Sulla

6

链接器读取一个lib文件,在执行期间使用一个dll文件。lib文件在执行过程中基本上是没有用的,并且链接程序无法读取dll文件(除非可能以与此处无关的方式)。

使用lib文件进行静态链接和动态链接之间的差异可能会令人困惑,但是如果您了解一些历史记录,就会很清楚。

最初只有静态库。对于静态库,.lib文件包含obj文件。每个obj文件都是一个且只有一个编译器源代码输入文件的输出。lib文件只是相关obj文件的集合,就像将obj文件放在目录中一样。从本质上讲,这就是一个lib文件,一个obj文件库。对于静态链接,可执行文件使用的所有obj文件都组合到一个文件中。将其与动态链接进行比较,在动态链接中,可执行文件与它使用的其他代码位于一个文件中。

为了实现动态链接,Microsoft修改了lib文件的用法,使它们引用的是dll文件而不是obj文件中的位置。除此之外,静态链接库中的所有信息都与动态链接相同。除了动态链接的lib文件指定dll文件外,它们与它们中的信息完全相同。


1

在dll中是像exe中一样的“事物”(可以有任何类型的数据,导入,导出,读/写/可执行部分),但区别在于exe文件仅导出入口点(函数),而dll导出一个/许多功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.