静态库

3

当我想调用一些Windows函数,比如MessageBox时,我可以从user32.dll中导入它并调用(使用LoadLibrary和GetProcAddress)。但是Visual C++还使用了一个静态库,因此我不需要手动加载DLL和函数。它们是如何工作的?它们是否包含包装器,每次调用函数时都会调用LoadLibrary/GetProcAddress?

2个回答

6
你所提到的“静态库”实际上是一个导入库。这种类型的库包含记录,告诉链接器每个函数实际存在于哪个库中,本身不包含任何代码。链接器在可执行文件中创建导入记录,加载程序在加载时解析它们。这样修复运行时使用的地址,使你的代码不需要显式调用LoadLibraryGetProcAddress

1
不,它们只允许您使用DLL的静态链接。可执行文件包含一个从其他DLL文件中需要的函数列表,因此当加载可执行文件时,加载程序解析此列表并使用LoadLibraryGetProcAddress解析每个函数,并将结果保存到静态表(IAT,导入地址表)中。这只做一次。还有“延迟加载”DLL的概念,它仅在第一次调用函数时才解析地址,但很少使用。
通过这种方式,DLL的lib文件仅包含构建该列表所需的信息(导出函数的名称)。

使用延迟加载库的一个例子是支持多个DirectX版本并根据客户端机器选择一个版本的项目。它将列出所有支持版本的DLL作为延迟加载库,只有一个会被加载。 - IronMensan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接