当我想调用一些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. iOS静态库引用静态库
- 2. UNIX:静态库链接到静态库
- 3. Windows静态库
- 4. iOS静态库?
- 5. C#静态库
- 6. QT静态库静态编译
- 7. 动态加载静态库?
- 8. 静态和动态库
- 9. 静态库创建
- 10. LNK2019在静态库
- 11. 构建静态库
- 12. Visual C++静态库
- 13. 聚合静态库
- 14. 创建静态库
- 15. 组合静态库
- 16. 静态库和JNI
- 17. Iphone Link静态库
- 18. 静态库的ctypes?
- 19. Objective-C静态库
- 20. 两个静态库
- 21. ENABLE_BITCODE在静态库
- 22. 生成静态库
- 23. ranlib和静态库
- 24. 静态库和动态库:混乱
- 25. g ++静态库依赖于动态库
- 26. 静态/动态库vs .so库?
- 27. 静态库与动态库性能
- 28. 创建依赖于其他的静态库(RestKit)静态库
- 29. 链接第三方静态库到另一个静态库
- 30. 编译静态库内的静态库 - 问题
使用延迟加载库的一个示例是支持多个版本的DirectX并基于客户端计算机选择一个的项目。它将列出所有受支持版本的DLL作为延迟加载库,实际上只加载一个。 – IronMensan