为什么隐式DLL链接需要相关的Lib文件,但显式链接不需要?

Nay*_*iya 8 c++ visual-c++

在Windows环境中

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

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

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

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

    我的问题是

    1. 为什么隐式链接也需要一个Lib文件?
    2. 需要从'Lib'文件中检索哪些信息无法从DLL或获取Header file
    3. 如果问题2存在问题,那么在明确加载时如何检索信息?

我已经走过了这个问题.但我无法理解任何有价值的理由.请,有人可以用简单的方式帮助解释这个问题.谢谢.

snf*_*snf 3

为什么隐式链接也需要Lib文件。

.libs中有dll的导入信息,可以使用以下命令查看该信息dumpbinWindows/Visual Studio SDK中包含的命令检查该信息。

这是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
Run Code Online (Sandbox Code Playgroud)

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

需要从“Lib”文件中检索哪些无法从 DLL 或头文件中获取的信息

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

  • 如果它位于 .lib 内部,则它只是链接到它。
  • 但是,如果存在有关外部引用 (DLL) 的信息,它将在导入表内构建导入,以便动态加载。

如果问题 2 有问题,显式加载时如何检索这些信息。

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

如果你有不明白的地方就问我,如果你想更好地理解的话,可以尝试使用 dumpbin 并阅读有关 PE 的内容。