静态库,静态链接的动态库和动态链接的动态库的.lib文件内部是什么?
因此,在动态链接的动态库中不需要.lib文件,在静态链接中也不需要.lib文件,只是具有所有方法的.obj文件。那是对的吗?
Answers:
对于静态库,.lib文件包含该库的所有代码和数据。然后,链接器将标识所需的位并将其放入最终的可执行文件中。
对于动态库,.lib文件包含从库中导出的函数和数据元素的列表,以及有关它们来自哪个DLL的信息。链接器生成最终的可执行文件时,如果使用库中的任何功能或数据元素,则链接器将添加对DLL的引用(导致Windows会自动加载它),并将条目添加到可执行文件的导入表中,这样该函数的调用被重定向到该DLL。
您不需要.lib文件即可使用动态库,但是如果没有动态库,则无法将DLL中的函数视为代码中的常规函数。相反,您必须手动调用LoadLibrary
以加载DLL(FreeLibrary
完成后),并GetProcAddress
获取DLL中的函数或数据项的地址。然后,您必须将返回的地址转换为适当的函数指针,才能使用它。
我发现汉斯的以下回答在这里也很有用。它清除了可能存在两种类型的lib文件的信息。
LIB文件用于构建您的程序,它仅存在于您的构建计算机上,并且您不发货。有两种。静态链接库是一袋.obj文件,它们被收集到一个文件中。链接器需要解析外部标识符时,会从文件中选择所有代码块。
但是与DLL更相关的是,LIB文件也可以是导入库。然后,它是一个简单的小文件,其中包含DLL的名称以及DLL导出的所有功能的列表。在构建使用DLL的程序时,需要将其提供给链接器,以便它知道外部标识符实际上是DLL导出的函数。链接器使用导入库将条目添加到EXE的导入表中。Windows随后在运行时使用它来确定需要加载哪些DLL才能运行该程序。
在静态库中,lib文件包含该库提供的功能的实际目标代码。在共享版本(您称为静态链接的动态库)中,只有足够的代码可以在运行时建立动态链接。
我不确定“动态链接的动态库”(以编程方式加载)。在这种情况下,您是否甚至还链接了.lib?
编辑:
来晚了一点,但是没有,您没有链接.lib。好吧,您链接到其中带有libraryloaderex的库。但是对于您正在使用的实际库,您可以通过C函数指针提供自己的绑定,并使用loadlibrary进行填充。
总结如下:
链接ǁ静态| DLL | 负载库 =========ǁ============== | ======================== ================== API代码ǁ在您的com- | 在DLL中| 在DLL中 生活ǁ计划 | ---------ǁ----------------- || ---------------------- |- ------------------ 功能ǁ直接,可以| 通过表间接| 通过您间接 通话ǁ被淘汰| 自动填充| 自己的功能 ---------ǁ----------------- || ---------------------- |- ------------------ 负担ǁ编译器| 编译器/操作系统| 您/操作系统
链接器读取一个lib文件,在执行期间使用一个dll文件。lib文件在执行过程中基本上是没有用的,并且链接程序无法读取dll文件(除非可能以与此处无关的方式)。
使用lib文件进行静态链接和动态链接之间的差异可能会令人困惑,但是如果您了解一些历史记录,就会很清楚。
最初只有静态库。对于静态库,.lib文件包含obj文件。每个obj文件都是一个且只有一个编译器源代码输入文件的输出。lib文件只是相关obj文件的集合,就像将obj文件放在目录中一样。从本质上讲,这就是一个lib文件,一个obj文件库。对于静态链接,可执行文件使用的所有obj文件都组合到一个文件中。将其与动态链接进行比较,在动态链接中,可执行文件与它使用的其他代码位于一个文件中。
为了实现动态链接,Microsoft修改了lib文件的用法,使它们引用的是dll文件而不是obj文件中的位置。除此之外,静态链接库中的所有信息都与动态链接相同。除了动态链接的lib文件指定dll文件外,它们与它们中的信息完全相同。