这些加载DLL何时加载:隐式链接VS显式链接

时间:2015-09-09 18:23:12

标签: c++ dll linker implicit explicit

我认为Implicit链接在应用程序启动后立即加载DLL,因为它也被称为"加载时动态链接"。但我在下面的链接(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx)中找到了一些奇怪的解释。

隐式链接

  

与程序代码的其余部分一样,DLL代码映射到地址中   进程启动并加载进程时进程的空间   只在需要时记忆。因此,PRELOAD和LOADONCALL代码   .def文件用于控制先前版本中的加载的属性   Windows不再具有意义。

明确链接

  

隐式链接到许多DLL的应用程序可能很慢   启动,因为Windows加载应用程序时加载所有DLL。   为了提高启动性能,应用程序可以隐式链接到   加载后立即需要这些DLL并等待显式   在需要时链接到其他DLL。

从此处隐式链接的另一种解释(https://msdn.microsoft.com/en-us/library/151kt790.aspx)。

隐式链接

  

Visual C ++链接器现在支持DLL的延迟加载。这个   使您无需使用Windows SDK函数LoadLibrary   和GetProcAddress实现DLL延迟加载。

     

在Visual C ++ 6.0之前,在运行时加载DLL的唯一方法是   使用LoadLibrary和GetProcAddress;操作系统会加载   使用它的可执行文件或DLL加载时的DLL。

     

从Visual C ++ 6.0开始,当与DLL静态链接时,   链接器提供了延迟加载DLL的选项,直到程序调用   该DLL中的一个函数。

     

应用程序可以使用/ DELAYLOAD(延迟加载)延迟加载DLL   带有辅助函数的Import)链接器选项(默认实现   由Visual C ++提供)。辅助函数将在运行时加载DLL   时间通过为您调用 LoadLibrary GetProcAddress

我真的很困惑,也不知道如何理解这些。

1。隐式链接是在启动时加载DLL还是仅在调用DLL中的函数时加载?

2。这意味着两者最终都是类似的,因为LoadLibrary()是在引擎盖下调用的吗?

1 个答案:

答案 0 :(得分:0)

@ remy-lebeau在他的评论中提供了很好的解释。我会在这里尝试作为答案。

here说明了隐式和显式dll加载之间的区别。 简而言之:

  • 显式加载中,应用程序通过显式调用LoadLibrary来加载dll。
  • 隐式加载中,应用程序在编译时指定dll,Windows loader在运行时加载它。

隐式加载具有许多优点,但由于在此阶段加载了所有dll,因此减慢了应用程序的加载时间。

为解决此问题,Microsoft支持Delayed Loaded Dlls,这是类型的隐式加载

通过使用它,您可以享受隐式加载的所有好处,但是仅当您的应用程序调用其函数之一时,才会加载dll。

对您的问题:

  1. 在隐式加载中,如果未将dll指定为延迟加载,则它将在应用程序启动时加载。如果您这样做了,它将在首次使用时加载。
  2. 是的。在所有情况下,dll均已加载并映射到应用程序内存。