我很好奇动态链接如何在Windows上运行。由于我们无法直接链接到Windows,因此Windows通常会将您的可执行文件链接到LIB文件,该文件包含DLL导出的函数存根。这种类型的链接是否在运行时产生LoadLibrary
和GetProcAddress
?如果没有,链接如何在内部工作?
答案 0 :(得分:2)
答案是也许。
默认方法是创建一个导入表,其中列出了所有必需的DLL以及从那里使用的函数。该表由OS直接解析。它可能会重用LoadLibrary背后的一些相同代码。它很可能不使用GetProcAddress
中的代码,但更喜欢对所有必要的函数进行单个批量查找。
然而有一个名为延迟加载的MSVC功能。使用此功能,MSVC ++不会构建此类导入表,而是插入实际的LoadLibrary
和GetProcAddress
调用。好处是这些电话是在最近的时刻发出的。虽然您不需要特定的DLL,但它没有加载。这可以加速程序启动。