EXE如何对DLL具有静态依赖性?

时间:2011-02-09 10:55:31

标签: windows visual-studio visual-c++ dll

通常在尝试运行使用DLL的EXE时,如果缺少DLL,则会出现标准的Windows错误:

  

程序无法启动,因为   您的计算机缺少XXX.dll。   尝试重新安装程序来修复   这个问题。

在调用任何代码之前,似乎内置于EXE中......它是如何工作的,以及在Visual Studio中构建项目时如何设置它?

编辑:

在我的特定场景中,我实际上有一个DLL,它对其他DLL有“静态”依赖,所以如果不存在,注册我的DLL失败,这有点难以诊断。但我宁愿不手动列出所使用的DLL函数,因为有很多!

1 个答案:

答案 0 :(得分:7)

链接到DLL时,有两种方法可以执行此操作:隐式链接和显式链接。你遇到的是隐式链接的失败。

隐式链接通过可执行映像中包含的导入表操作,该映像使用PE(可移植可执行文件)格式。 PE格式定义了导入和导出表。导出表包含DLL导出的函数列表及其入口点。导入表包含对其他模块的隐式依赖关系。

当可执行文件启动时,加载程序读取导入表,然后尝试加载所有引用的DLL和这些DLL中的所有函数。如果找不到DLL,DLL无法正确加载,或者DLL不包含引用的函数,则可能会失败。在你的情况下,它失败了,因为加载器在DLL搜索路径中没有找到XXX.dll

链接器将生成导入表。在C ++中,这通常是通过该DLL的.lib文件完成的。

显式链接是代码调用LoadLibraryGetProcAddress以加载DLL及其功能的地方。通常,当您要编写可在不同系统上运行的应用程序时,可以使用此方法。例如,您可能希望使用仅在某些操作系统版本上出现的某些功能,但在较旧版本的操作系统上运行时会降低某些其他行为。

引用链接到DLL时,不应使用术语 static 。静态链接是指函数的实现包含在图像中而不是包含在外部库中。

该主题的MSDN article解释了所有这些以及更多内容。