gpt4 book ai didi

c++ - 为什么隐式 DLL 链接需要相关的 Lib 文件而显式链接不需要?

转载 作者:可可西里 更新时间:2023-11-01 17:56:56 39 4
gpt4 key购买 nike

在 Windows 环境中,

当我尝试显式(使用 LoadLibrary)将 DLL 链接到我的程序时,

  • 首先我需要根据每个定义函数指针DLL 中的函数签名。
  • 然后使用“GetProcAddress”获取函数地址并将它们分配给那些指针。

当我尝试将 DLL 链接到我的程序时隐式(使用头文件)

  • 首先需要相关的头文件来获取函数签名。
  • 然后它需要用 DLL 生成的相关 Lib 文件。

    我的问题是

    1. 为什么隐式链接也需要一个Lib 文件?
    2. 它需要从“Lib”文件中检索哪些无法从 DLLHeader 文件 中获取的信息?
    3. 如果有问题 2,显式加载时如何检索信息?

我已经通过了 this问题。但我无法理解任何有值(value)的理由。拜托,有人可以帮助用简单的术语解释一下吗?谢谢。

最佳答案

Why Implicitly linking need Lib file too.

.libs中有dll的导入信息,可以使用Windows/Visual Studio SDK自带的dumpbin命令查看。

例如ws2_32.lib中recv的链接信息:

Version      : 0
Machine : 14C (x86)
TimeDateStamp: 4907F6ED Wed Oct 29 01:38:53 2008
SizeOfData : 00000014
DLL name : WS2_32.dll
Symbol name : _recv@16
Type : code
Name type : ordinal
Ordinal : 16

您可以检查 ws2_32.dll 中是否有序号和名称(检查现在它说要导入一个 DLL)。

What information it need to retrieve from 'Lib' file that cannot get from DLL or Header file

在头文件中,没有从哪里提取导入的信息,所以它们在编译时被标记为导入(__imp__name),当它链接到 .lib 时,它解析名称:

  • 如果它在 .lib 中,它只是链接到它。
  • 但是如果有外部引用(DLL)的信息,它会在导入表中构造导入,以便动态加载。

If there is something for question 2, How those information retrieve when explicit loading.

如果对于显式加载,您指的是 LoadLibrary,那么您是在运行时告诉它,而不是在链接时。因此 PE 加载器将在 PATH 中搜索 DLL 并动态加载它。然后你有其他函数来获取导出的函数地址。

如果你不明白什么就问我,如果你想更好地理解这一点,请尝试使用 dumpbin 并阅读有关 PE 的内容。

关于c++ - 为什么隐式 DLL 链接需要相关的 Lib 文件而显式链接不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825252/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com