什么时候加载dll:隐式链接VS显式链接
When do these load DLLs : Implicit Linking VS Explicit Linking
我认为隐式链接在应用程序启动时加载DLL,因为它也被称为"加载时动态链接"。但是我从下面的链接(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx)中发现了一些奇怪的解释。
隐式链接
像程序的其他代码一样,DLL代码被映射到地址进程启动时的空间,它被加载到只在需要的时候记忆。因此,PRELOAD和LOADONCALL代码在以前版本中,.def文件用来控制加载的属性
显式链接
隐式链接到许多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进行静态链接时linker提供了延迟加载DLL直到程序调用的选项DLL中的一个函数。
应用程序可以使用/DELAYLOAD (delay load)来延迟加载DLL带有辅助函数(默认实现)的链接器选项由Visual c++提供)。helper函数将在运行时加载DLL为您调用LoadLibrary和GetProcAddress。
我真的很困惑,不知道如何理解这些。
1。隐式链接是否在启动时加载DLL或仅在调用DLL中的函数时加载?
2。这意味着两者在结束时是相似的,因为LoadLibrary()是在引擎盖下调用?
@remy-lebeau在他的评论中给出了很好的解释。我将在这里详细说明作为答案。
这里解释了隐式和显式dll加载之间的区别。总之:
- 在显式加载中,应用程序通过显式调用LoadLibrary来加载dll。
- 在隐式加载中,应用程序在编译时指定dll, Windows加载器在运行时加载它。
隐式加载有很多优点,但是它减慢了应用程序的加载时间,因为所有dll都是在这个阶段加载的。
为了解决这个问题,微软支持延迟加载dll,这是一种类型的隐式加载。
通过使用它,你可以享受隐式加载的所有好处,但是只有当应用程序调用它的一个函数时,dll才会被加载。
回答你的问题:
- 在隐式加载中,如果没有指定延迟加载,dll将在应用程序启动时加载。如果你这样做了,它将在第一次使用时加载。
- 是的。在所有的场景中,dll都被加载并映射到应用程序内存。
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- VS 2017 社区收到链接器错误,但专业版没有
- VisualStudio 2015 链接器查找 VS 2010 库
- 如何在ubuntu中的vs代码中链接用于c++的fftw3库
- 如何在VS Code中创建C++项目并链接主,函数和标题?
- 为什么 VS C++链接器返回具有混合 DLL 转发的"LNK2001: unresolved external symbol"?
- 如何在VS项目中静态链接没有dll文件的cpprest?
- LLVM:VS 2015 中的链接错误
- VS 2008:链接命令包括我没有要求且不存在的库
- VS 2010 c++ Express 无法链接 recv() 和 send()
- 与openCV的vs 2013中的lib链接
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- 在VS 2010中链接WASAPI
- C++/VS 2012-多项目解决方案:一个项目中存在链接器错误,但另一个项目没有
- VS 2010 Qt 加载项中的链接错误
- 在 VS 中,以编程方式获取链接器>其他库目录属性,或获取宏值
- 如何在VS C++2010 express中链接库
- 如何在VS 2010中自动链接依赖项的依赖项
- 什么时候加载dll:隐式链接VS显式链接
- 动态链接vs静态链接效率