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++提供的默认实现).辅助函数将通过为您调用LoadLibrary和GetProcAddress在运行时加载DLL .
我真的很困惑,不知道如何理解这些.
1.隐式链接是在启动时还是仅在调用DLL中的函数时加载DLL?
这意味着两者最终都是类似的,因为LoadLibrary()是在引擎盖下调用的?
@remy-lebeau 在他的评论中提供了很好的解释。我将尝试在这里详细说明作为答案。
这里解释了隐式和显式 dll 加载之间的区别。简而言之:
隐式加载有很多优点,但它会减慢应用程序加载时间,因为所有 dll 都会在此阶段加载。
为了解决这个问题,微软支持延迟加载Dlls,这是一种隐式加载。
通过使用它,您可以享受隐式加载的所有好处,但只有当您的应用程序调用其函数之一时,DLL 才会被加载。
对于您的问题:
| 归档时间: |
|
| 查看次数: |
1993 次 |
| 最近记录: |