Re: [問題] dll跟lib 的問題

看板C_and_CPP作者 (小飄)時間15年前 (2010/02/27 10:34), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串2/2 (看更多)
我整理了一下板上有關 dll和 lib 的討論 可以幫我看看我的理解有錯嗎 謝謝 -------------------- 最簡單的選擇是把 *.cpp跟*.h 全部放在自己的專案內,但是如果不想給別人source code or 專案過大編譯會很久, 那就編譯成 lib 吧 *.cpp 經過 compile 以後變成 *.obj,把所有的object files 做 linking 之後就會變 成 executable file。 static lib 其實就是很多 object files 的 archive,也就是把一堆編譯出來的 .obj (或 .o)檔封在一個檔案裡,這樣你在 linking 的時候只要指定一個 lib 檔而不需要 指定一堆 objec files。 所以結論是 阴 每個 .cpp 可以各自變成 .obj,這些 .obj 可包成一個 lib dynamic loading / dynamic linking dynamic loading (compile time)的話,需要.h .lib .dll 編譯的時候,debug版的lib要對應到相對的.dll。release版的lib要對應到.dll然後要 include那份.h檔。 在VC下,要設定一下liker裡面的內容,把需要的.lib加上去或是用#pragma comment(lib,"xxx.lib") 說會用到哪一個.lib,而.dll必須放在project能找的到的路徑 下。 dynamic linking (run time)的話,需要的是.dll, 可分implicit跟explicit兩種。 implicit需要 .h , .lib 和.dll,而explicit需要 .h, .dll。 上面所討論的 .h和 .h是不一樣的東西了… explicit 内的.h 是裡面定義了函式指標的type,也就是像 #ifdef __cplusplus //把宣告的函式包起來 extern "C" { typedef void (WINAPI *ptrFuncFoo)(); 這類的function pointer的type宣告。 然後在另一個讀dll的程式利用 HMODULE hGAL=LoadLibrary("xxx.dll") 載入DLL 接著使用 GetProcAddress(hGAL,"function_name") 函式取得所要使用的函式的位址,最後不需要用到此DLL時,呼叫FreeLibrary()函式將DLL 釋放。麻煩在你必須知道這個function的參數,而且要另外寫好幾個function pointer, 然後一個一個對應過去… 目前看過的GetProcAddress()的參數有兩種, 一種是.dll裡面的名字;一種是個數字,如GetProcAddress(1)。會用到 GetProcAddress()和LoadLibrary()的話,就只需要.dll,不需要.lib了。 因為 GetProcAddress 是 C 的函式,所以在 C++ 的 name mangling 上要加上 extern "C" 才容易找得到 假設我們在dll有個function 定義成 bool Foo(const char*, int); 那使用GetProcAddress時可能要寫成這樣 GetProcAddress(hModule, "?Foo@@YG_NPBDH@Z");來取得 定義成 extern "C" bool Foo(const char*, int); 才能用GetProcAddress(hModule, "Foo");來取得 問題就在我們要知道C++為函式產生的名稱是比較麻煩的 所以用C的模式比較簡單 而implicit 内的 .h 則是長的像這個模樣的…配合.lib, .dll使用 #ifdef ExportDll #define ExportDll __declspec( dllexport ) #else #define ExportDll __declspec( dllimport ) #endif void ExportDll WINAPI foo(); --------------------------- ※ 引述《tocute (小飄)》之銘言: : 小弟一直以來對於何時使用lib 跟dll 一直都一知半解 : 所以趁今天有空想把他弄懂 : 小弟有爬過文了 也有google 過了 : 找到這篇文章 : http://topic.csdn.net/u/20090902/22/a6c8dbee-0901-481f-b12f-109a06c13397.html : 請問裡面說的 靜態庫 動態庫 lib 這三者有什麼不同呢 : 謝謝回答 : 另外有沒有網站清楚說明 static / dynamic load/link : 最好是有範例 這樣就更清楚了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.31.129.166

02/28 00:18, , 1F
我印象中DLL的連結分成load time和run time兩種
02/28 00:18, 1F

02/28 00:20, , 2F
load time是implicit,run time是explicit
02/28 00:20, 2F

02/28 00:21, , 3F
你這邊提的dynamic loading和implicit好像重複了...
02/28 00:21, 3F

02/28 16:37, , 4F
load time linking 作法在 make 時不使用到 dll 檔。
02/28 16:37, 4F
文章代碼(AID): #1BYFKuo4 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BYFKuo4 (C_and_CPP)