静态库、静态链接动态库和动态链接动态库的.lib文件的内部是什么?
为什么在动态链接的动态库中不需要.lib文件,在静态链接中,.lib文件只是一个包含所有方法的.obj文件。对吗?
发布于 2010-07-15 16:37:14
对于静态库,.lib文件包含该库的所有代码和数据。链接器然后识别它需要的位,并将它们放入最终的可执行文件中。
对于动态库,.lib文件包含从库中导出的函数和数据元素的列表,以及有关它们来自哪个DLL的信息。当链接器构建最终的可执行文件时,如果使用了库中的任何函数或数据元素,则链接器将添加对DLL的引用(导致它由Windows自动加载),并将条目添加到可执行文件的导入表中,以便将对该函数的调用重定向到该DLL。
使用动态库不需要.lib文件,但是如果没有动态库,就不能将动态链接库中的函数视为代码中的普通函数。相反,您必须手动调用LoadLibrary来加载DLL (完成后调用FreeLibrary ),并手动调用GetProcAddress来获取DLL中函数或数据项的地址。然后,您必须将返回的地址转换为适当的指向函数的指针,才能使用它。
发布于 2015-05-08 17:45:03
我发现遵循Hans中的answer也很有用,here.It澄清了可能存在两种类型的库文件的问题。
一个LIB文件是用来构建你的程序的,它只存在于你的构建机器上,你不会发布它。有两种。静态链接库是一堆.obj文件,收集到单个文件中。当链接器需要解析外部标识符时,它会从文件中选取任何代码块。
但与DLL更相关的是,LIB文件也可以是导入库。然后,它是一个简单的小文件,其中包括DLL的名称和由DLL导出的所有函数的列表。在构建使用DLL的程序时,您需要将其提供给链接器,以便它知道外部标识符实际上是由DLL导出的函数。链接器使用导入库向EXE的导入表中添加条目。然后Windows在运行时使用它来确定需要加载哪些DLL才能运行程序。
发布于 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文件之外,它们与其中的信息都是相同的。
https://stackoverflow.com/questions/3250467
复制相似问题