Re: [問題] dll跟lib 的問題
我整理了一下板上有關 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
02/28 00:18, 1F
→
02/28 00:20, , 2F
02/28 00:20, 2F
→
02/28 00:21, , 3F
02/28 00:21, 3F
→
02/28 16:37, , 4F
02/28 16:37, 4F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
問題
0
5