我是vC++的新手。我剛剛構建了一個軟件,它生成了一個.dll和一個.lib。我需要在我的代碼中使用這個函數。我是否需要鏈接到.lib和.dll才能構建我的代碼?我必須改變哪些項目屬性才能進行此鏈接?.h,.dll和.lib混淆
回答
其實,你只需要.dll文件。它包含運行其功能的所有必要代碼和數據。它還包含一個表,它將函數的符號名稱(例如PrintMe函數),它們的序號(DLL中該函數的編號)以及它們在DLL中的地址鏈接起來。
如果您只想使用DLL,則必須「手動」獲取已解決的符號:
假設您要使用DLL的函數PrintMe。你所要做的是解決它的名字(PrintMe)或它的序號(PrintMe是DLL的第一個函數)到它的地址。爲此,您可以使用Win32 API(也稱爲Windows SDK)中的LoadLibrary,GetModuleHandle和GetProcAdress。此外,此方法允許您在運行時加載DLL(請參見下文)。
更簡單的方法是使用MSVC(++)功能__declspec(dllexport)和__declspec(dllimport),例如,
// your DLL
__declspec(dllexport) void PrintMe()
{
printf("Hello World!");
}
// you project to use the DLL
__declspec(dllimport) void PrintMe();
第一個(dllexport)告訴編譯器導出函數。第二個(dllimport)是有趣的一個:它創建所有必要的代碼,以便能夠使用DLL中的函數。
爲此,您需要項目中的.lib文件(該文件要使用DLL)。 .lib文件包含鏈接器將符號名稱(PrintMe)解析爲DLL中地址的信息。由於.lib是靜態綁定的,鏈接器可以使用它 - 相反,DLL在運行時/加載時綁定,所以鏈接器不能使用它。 (是的,.lib文件中的信息是多餘的。)。注意:當使用此方法時,無法使用新的.lib文件重建項目來更改整個DLL。某些結構更改會影響DLL中函數的地址,請參見this SO answer。
通過__declspec使用Win32 API(LoadLibrary ...)和MSVC方法之間的最後一個區別是DLL的加載。當你使用LoadLibrary的時候,DLL當然是在運行時加載的(所以你可以在發現異常的時候發現它,等等)。另一種方法在加載時加載DLL,所以當Windows無法找到DLL時,程序將終止(不會運行)。
在VS中創建項目時,可以激活嚮導(Win32項目)結尾處的「導出符號」複選框。這給你一些導出符號的例子。此外,它引入了一個宏加一個預處理defition加上一些指令是非常有用的:
// DLL header
#ifdef _YOUR_DLL_EXPORTS
#define YOUR_DLL_API __declspec(dllexport)
#else
#define YOUR_DLL_API __declspec(dllimport)
#endif
YOUR_DLL_API PrintMe();
現在你可以使用這個頭文件來建立你的DLL作爲您的DLL項目有_YOUR_DLL_EXPORTS定義(見項目屬性頁, C++,預處理器)。使用DLL的項目也可以使用這個頭文件,但是不能有這樣的名字定義。將頭文件包含在要使用該DLL的項目中時,該宏將解析爲__declspec(dllimport)。這指示鏈接器查找此函數(可在.lib文件中找到該函數),並創建所有必要的代碼以在運行時加載DLL並解析符號名稱。
+1。希望我可以多投這個票。 – 2012-11-29 21:40:46
應該指出,還有一些被稱爲「導入庫」檢查http://stackoverflow.com/questions/3573475/how-does-the-import-library-work-details – 2016-09-08 22:49:22
@WakanTanka是的,這是。我在我的回答中談到了.lib。感謝您的鏈接。 – dyp 2016-09-09 10:24:40
- 1. 與DLL混淆。沒有.lib或.h
- 2. WSPBuilder混淆dll
- 3. 混淆.Net Dll
- 4. 引用混淆DLL
- 5. 混淆了DLL和Azure包的部署
- 6. .dll,.lib,.h文件有什麼區別?
- 7. 混淆Windows Phone 8 dll
- 8. 混淆.NET EXE/DLL的
- 9. c庫lib curl編譯混淆?
- 10. Winsock2.h vs winsock2.h和wsock32.lib vs ws2_32.lib
- 11. 如何.H,.LIB和.dll文件一起工作
- 12. 使用包含「.h」,「.lib」和「.dll」文件的第三方庫
- 13. 在Visual Studio 2010中創建.h和.lib中的.dll
- 14. 使用.h .lib和.dll文件附帶的SDK
- 15. 混淆和jOOQ
- 16. 混淆和SHA?
- 17. 混淆和GPL
- 18. 頭文件(.h),庫文件(.lib)和DLL(.dll)文件如何相關
- 19. DLL和LIB文件
- 20. 不使用混淆器的DLL加密
- 21. 創建DLL,與__declspec混淆(dllexport)
- 22. 如何混淆由xsltc生成的dll
- 23. 在WinForms中混淆DLL使用
- 24. Rails和REST混淆
- 25. javascript和silverlight混淆!
- 26. WebApiRequestLifestyle和BackgroundJob混淆
- 27. Proguard混淆和Renderscript
- 28. IIS7和WCF混淆
- 29. caliburn微和混淆
- 30. HeapCreate和HeapAlloc混淆
另請參閱http://stackoverflow.com/questions/1778111/whats-the-differences-between-dll-lib-h-files – dyp 2010-08-30 11:02:32