通常在尝试运行使用DLL的EXE时,如果缺少DLL,则会出现标准的Windows错误:
程序无法启动,因为 您的计算机缺少XXX.dll。 尝试重新安装程序来修复 这个问题。
在调用任何代码之前,似乎内置于EXE中......它是如何工作的,以及在Visual Studio中构建项目时如何设置它?
编辑:
在我的特定场景中,我实际上有一个DLL,它对其他DLL有“静态”依赖,所以如果不存在,注册我的DLL失败,这有点难以诊断。但我宁愿不手动列出所使用的DLL函数,因为有很多!
答案 0 :(得分:7)
链接到DLL时,有两种方法可以执行此操作:隐式链接和显式链接。你遇到的是隐式链接的失败。
隐式链接通过可执行映像中包含的导入表操作,该映像使用PE(可移植可执行文件)格式。 PE格式定义了导入和导出表。导出表包含DLL导出的函数列表及其入口点。导入表包含对其他模块的隐式依赖关系。
当可执行文件启动时,加载程序读取导入表,然后尝试加载所有引用的DLL和这些DLL中的所有函数。如果找不到DLL,DLL无法正确加载,或者DLL不包含引用的函数,则可能会失败。在你的情况下,它失败了,因为加载器在DLL搜索路径中没有找到XXX.dll
。
链接器将生成导入表。在C ++中,这通常是通过该DLL的.lib文件完成的。
显式链接是代码调用LoadLibrary
和GetProcAddress
以加载DLL及其功能的地方。通常,当您要编写可在不同系统上运行的应用程序时,可以使用此方法。例如,您可能希望使用仅在某些操作系统版本上出现的某些功能,但在较旧版本的操作系统上运行时会降低某些其他行为。
引用链接到DLL时,不应使用术语 static 。静态链接是指函数的实现包含在图像中而不是包含在外部库中。
该主题的MSDN article解释了所有这些以及更多内容。