首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态库、静态链接动态库和动态链接动态库的.lib文件内部是什么?

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

Stack Overflow用户
提问于 2010-07-15 04:57:30
回答 4查看 69.4K关注 0票数 92

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-15 16:37:14

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

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

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

票数 163
EN

Stack Overflow用户

发布于 2015-05-08 17:45:03

我发现遵循Hans中的answer也很有用,here.It澄清了可能存在两种类型的库文件的问题。

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

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

票数 15
EN

Stack Overflow用户

发布于 2016-04-22 10:11:07

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

将lib文件用于静态链接和动态链接之间的区别可能会令人困惑,但如果您了解一点历史,那么它就会变得非常清楚。

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3250467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档