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

时间:2013-07-24 04:32:39

标签: c++ visual-c++

在Windows环境中

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

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

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

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

    我的问题是

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

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

2 个答案:

答案 0 :(得分:3)

  

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

.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)。

  

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

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

  • 如果它在.lib中,它只是链接它。
  • 但如果有关于外部引用(DLL)的信息,它将在导入表中构造导入,因此它会以非语言方式加载。
  

如果问题2存在问题,那么在显式加载时如何检索这些信息。

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

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

答案 1 :(得分:1)

隐式链接时,函数声明指定要在程序中使用的名称,以及原型和调用约定。但是需要更多信息。具体做法是:

  1. 该函数在DLL中外部实现的事实。
  2. 该DLL的名称。
  3. 函数的导出名称。这是用于从DLL导出函数的名称,该名称可能与导入时使用的名称不同。
  4. 一些语言设计者选择使用语言扩展来提供此信息。例如德尔福采取这种方式。隐式链接完全在没有.lib文件的代码中指定。另一方面,C和C ++的约定是使用.lib文件来指定缺少的信息。