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

Jen*_*nix 6 c++ dll linker explicit implicit

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

隐式链接

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

显式链接

隐式链接到许多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(Visual C++提供的默认实现).辅助函数将通过为您调用LoadLibraryGetProcAddress在运行时加载DLL .

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

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

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

Yos*_*biv 3

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

这里解释了隐式和显式 dll 加载之间的区别。简而言之:

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

隐式加载有很多优点,但它会减慢应用程序加载时间,因为所有 dll 都会在此阶段加载。

为了解决这个问题,微软支持延迟加载Dlls,这是一种隐式加载

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

对于您的问题:

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