编译 dll 项目时生成的 .lib 文件有什么用,我可以将它用于静态链接吗?
What is usefulness of .lib file generated while compiling the dll projects, can i use it for static linking?
想问一下编译dll项目时生成的.lib文件有什么用
当我们编译我们的项目时,会生成以下文件:
.dll
.exp
.lib
.pdb
现在我们也有了 .lib 文件,我们可以使用这个文件静态地 link 它到任何其他项目。如果不是,那么生成这个 .lib 文件有什么用。
.lib 的共享库不用于静态 linking,它用于让 linker 了解隐藏在 .dll 文件中的内容。将其视为您提供给 linker 的头文件,以确保它知道属于 .dll 的所有函数以及您需要的函数。问自己一个问题:如果没有 .lib,您将如何使用生成的 .dll 文件? LoadLibrary 不算数 - 它有复杂性(class 方法?修改?)并产生不确定性,例如 opencv_ffmpeg.dll:它不能存在于 PATH 中,并且 opencv_video-linked 程序仍然会 运行,但不会告诉我们任何信息,而且没有它也不会播放视频 - 没有明确的错误消息。另外,这个方法是platform-specific.
另一方面,.lib 静态库包含一个 full-fledged 目标文件,它直接包含在可执行文件中。
基本思想 - 无论是静态库还是共享库,你仍然应该 link 它们几乎相同 - 但是,如果它是共享库,你的程序将不会 运行没有将相应的 .dll 包含到分发中。
与 .dll
一起生成的 .lib
称为 "import library",它允许您使用 dll 函数,包括它们的 header,就好像它们是静态链接的一样在你的 executable 中。它确保当链接器必须修复引用到 object 文件中的 dll 函数地址时,它可以在导入库中找到它们。在导入库中找到的这些函数实际上是存根,它从导入地址 Table 中检索加载的 dll 中相应函数的实际地址并直接跳转到它(传统上;现在链接器中有一些智能允许以避免这种双跳)。
导入库又包含链接器的特殊指令,指示链接器将相关条目生成到 executable 的导入 table 中,进而在加载时读取加载程序的时间("dynamic linker",在 Unix 术语中)。这确保在调用 executable 的入口点之前,加载引用的 dll,并且 IAT 包含引用函数的正确地址。
请注意,所有这些主要只是为了方便您调用 dll 函数,就像它们静态链接到您的 executable 一样。如果您显式地处理动态 load/function 地址检索(使用 LoadLibrary 和 GetProcAddress),您并不严格 需要 .lib 文件;将所有这些东西委托给链接器和加载器会更方便。
想问一下编译dll项目时生成的.lib文件有什么用
当我们编译我们的项目时,会生成以下文件: .dll .exp .lib .pdb
现在我们也有了 .lib 文件,我们可以使用这个文件静态地 link 它到任何其他项目。如果不是,那么生成这个 .lib 文件有什么用。
.lib 的共享库不用于静态 linking,它用于让 linker 了解隐藏在 .dll 文件中的内容。将其视为您提供给 linker 的头文件,以确保它知道属于 .dll 的所有函数以及您需要的函数。问自己一个问题:如果没有 .lib,您将如何使用生成的 .dll 文件? LoadLibrary 不算数 - 它有复杂性(class 方法?修改?)并产生不确定性,例如 opencv_ffmpeg.dll:它不能存在于 PATH 中,并且 opencv_video-linked 程序仍然会 运行,但不会告诉我们任何信息,而且没有它也不会播放视频 - 没有明确的错误消息。另外,这个方法是platform-specific.
另一方面,.lib 静态库包含一个 full-fledged 目标文件,它直接包含在可执行文件中。
基本思想 - 无论是静态库还是共享库,你仍然应该 link 它们几乎相同 - 但是,如果它是共享库,你的程序将不会 运行没有将相应的 .dll 包含到分发中。
与 .dll
一起生成的 .lib
称为 "import library",它允许您使用 dll 函数,包括它们的 header,就好像它们是静态链接的一样在你的 executable 中。它确保当链接器必须修复引用到 object 文件中的 dll 函数地址时,它可以在导入库中找到它们。在导入库中找到的这些函数实际上是存根,它从导入地址 Table 中检索加载的 dll 中相应函数的实际地址并直接跳转到它(传统上;现在链接器中有一些智能允许以避免这种双跳)。
导入库又包含链接器的特殊指令,指示链接器将相关条目生成到 executable 的导入 table 中,进而在加载时读取加载程序的时间("dynamic linker",在 Unix 术语中)。这确保在调用 executable 的入口点之前,加载引用的 dll,并且 IAT 包含引用函数的正确地址。
请注意,所有这些主要只是为了方便您调用 dll 函数,就像它们静态链接到您的 executable 一样。如果您显式地处理动态 load/function 地址检索(使用 LoadLibrary 和 GetProcAddress),您并不严格 需要 .lib 文件;将所有这些东西委托给链接器和加载器会更方便。