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

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

问题描述:

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

为什么在动态链接的动态库中不需要.lib文件,而且在静态链接中,.lib文件只不过是包含所有方法的.obj文件。那是对的吗?

+2

可以注意到这个问题是关于MS Windows平台的。 – cubuspl42 2015-01-22 13:13:12

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

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

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

+1

经过漫长的搜索后,国际海事组织,我得到了使用lib和dll的原因的最佳答案。谢谢 – Jeet 2016-02-19 08:30:41

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

我不确定“动态链接动态库”(以编程方式加载)。在这种情况下你甚至可以链接到.lib文件吗?

编辑:

有点姗姗来迟,但没有,你不链接的.lib。那么,你可以通过libraryloaderex链接到lib。但是,对于您正在使用的实际库,通过C函数指针提供自己的绑定和调用LoadLibrary填补那些

这里有一个总结:

 
Linking ǁ Static  | DLL     | LoadLibrary 
=========ǁ===============|======================|=================== 
API code ǁ In your com- | In the DLL   | In the DLL 
lives ǁ piled program |      | 
---------ǁ---------------|----------------------|------------------- 
Function ǁ Direct, may | Indirect via table | Indirect via your 
calls ǁ be elided  | filled automatically | own function ptrs 
---------ǁ---------------|----------------------|------------------- 
Burden ǁ Compiler  | Compiler/OS   | You/OS 
+0

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

在DLL的是“东西”就像在一个exe (可以有任何种类的数据,导入,导出,读/写/可执行部分),但区别在于exe文件只导出入口点(函数),但dll导出一个/多个函数。

我发现下面这个汉斯的answer在这里也很有用。它清除了可能有两种类型的lib文件的空气。

一个LIB文件用于构建您的程序,它只存在于您的构建 机器上,并且您不运送它。有两种。静态链接 库是一包.obj文件,收集到一个文件中。当需要解析 外部标识符时, 链接器会从文件中选取任何代码块。

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

链接器读取lib文件并在执行过程中使用dll文件。一个lib文件在执行期间基本上是无用的,并且链接器不能从读取一个dll文件(除非可能以这里无关的方式)。

使用lib文件进行静态链接和动态链接的区别可能会让人困惑,但如果您了解了一些历史记录,就会变得非常清楚。

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

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