當我想調用一些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