我想问一下编译dll项目时生成的.lib文件的用处。
编译项目时,会生成以下文件: .DLL .EXP 的.lib .PDB
现在我们也有.lib文件,我们可以使用此文件将其静态链接到任何其他项目。如果没有,那么生成此.lib文件的用途是什么。
答案 0 :(得分:14)
.lib
生成的.dll
被称为"导入库",它允许您使用dll函数,包括其标题,就像它们在您的静态链接一样可执行文件。它确保当链接器必须修复引用到目标文件中的dll函数地址时,它可以在导入库中找到它们。在导入库中找到的这些函数实际上是存根,它从导入地址表中检索加载的dll中相应函数的实际地址,然后直接跳转到它(传统上;现在链接器中有一些智能性可以避免这种情况跳)。
反过来,导入库包含链接器的特殊指令,指示它在可执行文件的导入表中生成相关条目,然后由加载程序在加载时读取("动态)链接器",在Unix术语中)。这样可以确保在调用可执行文件的入口点之前,加载引用的dll,并且IAT包含引用函数的正确地址。
请注意,所有这些只是方便的东西,允许您调用dll函数,就像它们静态链接到您的可执行文件。如果您显式处理动态加载/函数地址检索(使用LoadLibrary和GetProcAddress),则不要严格需要 .lib文件;将所有这些东西委托给链接器和加载器会更方便。
答案 1 :(得分:4)
.lib不用于静态链接,它用于为链接器提供隐藏在.dll文件中的内容的概念。将其视为头文件,您可以将其提供给链接器,以确保它知道属于.dll的所有函数以及您需要的函数。问自己一个问题:如果没有.lib,你将如何使用生成的.dll文件? LoadLibrary不算数 - 它有并发症(类方法?修改?)并产生不确定性,比如opencv_ffmpeg.dll:它不能存在于PATH中,而opencv_video链接的程序仍会运行,但赢了& #39;告诉我们任何事情,以及没有它就不会播放视频 - 没有明确的错误信息。此外,此方法是特定于平台的。
另一方面,.lib静态库包含一个完整的目标文件,该文件直接包含在可执行文件中。
基本思想 - 无论是静态库还是共享库,你仍然应该以相同的方式链接它们 - 但是,如果它是共享库,你的程序将不会在没有将相应的.dll包含到分发中的情况下运行。