当我想调用一些Windows函数,如MessageBox时,我可以从user32.dll中导入它并调用(使用LoadLibrary和GetProcAddress)。但是也有一个Visual C++使用的静态库,所以我不需要手动加载DLL和函数。他们如何工作?它们是否包含每次调用函数时调用LoadLibrary/GetProcAddress的包装?静态库
Q
静态库
3
A
回答
6
您所指的“静态库”实际上是import library。这种类型的库包含告诉链接器每个函数实际存在于哪个库中的记录,并且本身不包含任何代码。链接器在可执行文件中创建导入记录,加载程序在加载时解析该导入记录。这将修复运行时使用的地址,因此您的代码不需要明确地调用LoadLibrary
和GetProcAddress
。
1
不,他们只是允许你使用静态链接与DLL。可执行文件包含其他DLL文件所需的函数列表,因此加载可执行文件时,加载程序将解析此列表并使用LoadLibrary
和GetProcAddress
解析每个函数,将结果保存到静态表(IAT,导入的地址表) 。这只做一次。还有DLL的“延迟加载”的概念,它只会在函数第一次调用时才解析地址,但很少使用。
这样,DLL的lib文件只包含构建该列表所需的信息(导出函数的名称)。
相关问题
- 1. 链接静态库与静态库
- 2. C++:静态库引用静态库
- 3. iOS静态库引用静态库
- 4. UNIX:静态库链接到静态库
- 5. 静态库
- 6. 静态库
- 7. C#静态库
- 8. iOS静态库?
- 9. 静态库Android
- 10. Windows静态库
- 11. QT静态库静态编译
- 12. 静态库的静态成员
- 13. Visual Studio:静态链接到静态库
- 14. 静态和动态库
- 15. 动态加载静态库?
- 16. ENABLE_BITCODE在静态库
- 17. 静态库“接口”
- 18. Buildind NDK静态库
- 19. 静态链接库
- 20. 外部静态库
- 21. Objective-C静态库
- 22. 静态库的ctypes?
- 23. 静态库红色
- 24. 生成静态库
- 25. Iphone Link静态库
- 26. 包括静态库
- 27. 静态库创建
- 28. 两个静态库
- 29. 构建静态库
- 30. LNK2019在静态库
使用延迟加载库的一个示例是支持多个版本的DirectX并基于客户端计算机选择一个的项目。它将列出所有受支持版本的DLL作为延迟加载库,实际上只加载一个。 – IronMensan