lib和dll的區別與使用
丟擲幾個概念:庫、靜態庫、動態庫、連結、靜態連結、動態連結、顯示連結、隱式連結。
什麼是庫
庫:庫是寫好的現有的、成熟的、可以複用的程式碼。庫和可執行檔案的區別是:庫不是獨立程式,它是向其他程式提供服務的程式碼。
有哪些庫
有兩種庫:靜態庫(.a、.lib)和動態庫(.so、.dll),它們是兩種共享程式程式碼的方式。
靜態庫(Static library/Staticlink library):lib包含程式碼本身,在編譯時直接將程式碼加入到程式當中。在可執行檔案中包含了庫程式碼的一份完整拷貝。VS編譯成功後,只會生成一個.lib檔案。
動態庫(Dynamiclibrary/Dynamic link library
你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變數、函式或類。在倉庫的發展史上經歷了“無庫-靜態連結庫-動態連結庫”的時代。
靜態庫和動態庫中的lib有什麼區別
靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib中的指令都被直接包含在最終生成的EXE檔案中了。但是若使用DLL,該DLL不必被包含在最終EXE檔案中了。EXE檔案執行時可以“動態”地引用和解除安裝這個與EXE獨立的DLL檔案。
靜態庫中的lib:包含函式程式碼本身(包括函式的索引和實現),在編譯時直接將程式碼加入程式當中。
動態庫中的lib:包含函式所在的dll檔案和檔案中函式位置的索引,函式實現的程式碼由執行時載入到程序空間中的dll提供。
所以,lib是編譯時用到的,dll是執行時用到的。如果要完成程式碼的編譯,只需要lib,如果要使動態庫連結的程式執行起來,只需要dll。
連結的方式
連結器將一個個目標檔案(或許還有若干程式庫)連結在一起生成一個完整的可執行檔案。
靜態連結:使用靜態連結庫,連結器從靜態連結庫lib獲取所有被引用函式,並將庫同程式碼一起放到可執行檔案中。
動態連結:使用動態連結庫,允許可執行模組(.dll檔案或者.exe檔案)僅包含在執行時定位dll函式的可執行程式碼所需的資訊。
DLL的編制與具體的程式語言及編譯器無關
只要遵循約定的DLL介面規範和呼叫方式,用各種語言編寫的DLL都可以相互呼叫。譬如Windows提供的系統DLL(其中包括了Windows的API),在任何開發環境中都能被呼叫,不在乎是Visual Basic、Visual C++還是Delphi。
動態連結庫隨處可見
我們在Windows目錄下的system32資料夾中會看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數API都包含在這些DLL中。Kernel32.dll中的函式主要處理記憶體管理和程序排程;user32.dll中的函式主要控制使用者介面;gdi32.dll中的函式則負責圖形方面的操作。
一般的程式設計師都用過類似MessageBox的函式,其實它就包含在user32.dll這個動態連結庫中。由此可見DLL對我們來說其實並不陌生。
隱式連結與顯示連結
隱式連結與顯示連結是怎麼回事呢?其實這兩種方式只是dll的兩種不同的載入方式而已。
1. 匯出函式
2. 匯出類
3. extern ”C”
4. 不需要標頭檔案直接匯入動態連結庫