【发布时间】:2011-03-16 02:16:30
【问题描述】:
静态库、静态链接动态库和动态链接动态库的.lib文件里面是什么?
为什么在动态链接的动态库中不需要.lib文件,在静态链接中,.lib文件只不过是一个包含所有方法的.obj文件。对吗?
【问题讨论】:
-
可以注意到问题是关于MS Windows平台的。
标签: c++ dll linker static-libraries
静态库、静态链接动态库和动态链接动态库的.lib文件里面是什么?
为什么在动态链接的动态库中不需要.lib文件,在静态链接中,.lib文件只不过是一个包含所有方法的.obj文件。对吗?
【问题讨论】:
标签: c++ dll linker static-libraries
对于静态库,.lib 文件包含该库的所有代码和数据。然后链接器识别它需要的位并将它们放入最终的可执行文件中。
对于动态库,.lib 文件包含从库中导出的函数和数据元素的列表,以及它们来自哪个 DLL 的信息。当链接器构建最终的可执行文件时,如果使用了库中的任何函数或数据元素,则链接器添加对 DLL 的引用(导致 Windows 自动加载它),并将条目添加到可执行文件的导入表中,因此对函数的调用被重定向到该 DLL。
您不需要 .lib 文件即可使用动态库,但如果没有 .lib 文件,您将无法将 DLL 中的函数视为代码中的普通函数。相反,您必须手动调用LoadLibrary 来加载DLL(以及在完成后调用FreeLibrary),并调用GetProcAddress 来获取DLL 中函数或数据项的地址。然后,您必须将返回的地址转换为适当的指向函数的指针才能使用它。
【讨论】:
我发现关注 Hans 的 answer 在这里也很有用。它澄清了可能有两种类型的 lib 文件。
LIB 文件用于构建您的程序,它只存在于您的构建中 机器,你不发货。有两种。静态链接 库是一袋 .obj 文件,收集到一个文件中。这 链接器在需要解析时从文件中挑选任何代码块 一个外部标识符。
但与 DLL 更相关的是,LIB 文件也可以是导入库。 然后它是一个简单的小文件,其中包含 DLL 的名称和 DLL 导出的所有函数的列表。您需要提供 当您构建使用 DLL 的程序时,它会发送到链接器,因此它 知道外部标识符实际上是由 DLL。链接器使用导入库将条目添加到 EXE 的导入表。然后依次由 Windows 在 运行时来确定需要加载哪些 DLL 才能运行程序。
【讨论】:
在静态库中,lib 文件包含库提供的函数的实际目标代码。在共享版本(您所说的静态链接动态库)中,只有足够的代码在运行时建立动态链接。
我不确定“动态链接的动态库”(以编程方式加载)。在这种情况下,你甚至会链接到 .lib 吗?
编辑:
有点晚了,但不,你没有链接.lib。好吧,你链接到带有 libraryloaderex 的库。但是对于您实际使用的库,您可以通过 C 函数指针提供自己的绑定,然后 loadlibrary 会填充这些绑定。
总结如下:
连接ǁ 静态 |动态链接库 |加载库 ========ǁ================|======================|= =================== API 代码 ǁ 在您的 com- |在 DLL |在 DLL 中 生活ǁ 堆砌节目| | ---------ǁ----------------|----------------------|- ------------------ 功能ǁ 直接,可|间接通过表 |通过您的间接 调用ǁ 被省略 |自动填充 |自己的函数ptrs ---------ǁ----------------|----------------------|- ------------------ 负担 ǁ 编译器 |编译器/操作系统 |你/操作系统【讨论】:
链接器读取一个 lib 文件,并在执行期间使用一个 dll 文件。 lib 文件在执行过程中基本上是无用的,并且链接器无法读取 dll 文件(可能以与此处无关的方式除外)。
使用 lib 文件进行静态链接和动态链接之间的区别可能会令人困惑,但如果您了解一点历史,就会很清楚。
最初只有静态库。对于静态库,.lib 文件包含 obj 文件。每个 obj 文件是一个且只有一个编译器源代码输入文件的输出。 lib 文件只是相关 obj 文件的集合,就像将 obj 文件放在目录中一样。这本质上就是一个 lib 文件,一个 obj 文件库。对于静态链接,可执行文件使用的所有 obj 文件都合并到一个文件中。将其与可执行文件位于与其使用的其他代码分开的文件中的动态链接进行比较。
为了实现动态链接,Microsoft 修改了 lib 文件的使用,以便它们引用 dll 文件而不是 obj 文件中的位置。除此之外,静态链接库中的所有信息都与动态链接相同。除了动态链接的 lib 文件指定 dll 文件之外,它们中的信息都相同。
【讨论】:
在 dll 中是类似于 exe 中的“事物”(可以有任何类型的数据、导入、导出、读/写/可执行部分),但不同之处在于 exe 文件仅导出入口点(函数)但dll的导出一个/多个函数。
【讨论】: