函式和資料被編譯進乙個二進位制檔案(通常擴充套件名為.lib)。在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案(.exe檔案)。
在使用動態鏈結庫的時候,往往提供兩個檔案:乙個引入庫和乙個dll。引入庫包含被dll匯出的函式和變數的符號名,dll包含實際的函式和資料。在編譯鏈結可執行檔案時,只需要鏈結引入庫,dll中的函式**和資料並不複製到可執行檔案中,在執行的時候,再去載入dll,訪問dll中匯出的函式。
在執行windows程式時,它通過乙個被稱作「動態鏈結」的程序與windows相接。乙個windows的.exe檔案擁有它使用不同動態鏈結庫的引用,所使用的函式即在那裡。當windows程式被載入到記憶體中時,程式中的呼叫被指向dll函式的入口,如果dll不在記憶體中,系統就將其載入到記憶體中。當鏈結windows程式以產生乙個可執行檔案時,你必須鏈結由程式設計環境提供的專門的「導入庫(import library)庫」。這些導入庫包含了動態鏈結庫名稱和所有windows函式呼叫的引用資訊。鏈結程式使用該資訊在.exe檔案中構造乙個表,當引導程式時,windows使用它將呼叫轉換為windows函式。
導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。
(1)靜態鏈結方法:#pragma comment(lib,"test.lib") ,靜態鏈結的時候,載入**就會把程式會用到的動態**或動態**的位址確定下來。靜態庫的鏈結可以使用靜態鏈結,動態鏈結庫也可以使用這種方法鏈結導入庫。
(2)動態鏈結方法:loadlibrary()/getprocessaddress()和freelibrary(),使用這種方式的程式並不在一開始就完成動態鏈結,而是直到真正呼叫動態庫**時,引導程式才計算(被呼叫的那部分)動態**的邏輯位址,然後等到某個時候,程式又需要呼叫另外某塊動態**時,引導程式又去計算這部分**的邏輯位址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態鏈結的程式。
5.開發時應該使用動態鏈結還是靜態鏈結
簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態鏈結,顧名思義就是在應用程式啟動的時候才會鏈結,所以,當使用者的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點:
動態庫:
1.共享:多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要將動態庫載入到記憶體一次即可;
2.開發模組好:要求設計者對功能劃分的比較好。
靜態庫:
**的裝載速度快,執行速度也比較快,因為編譯時它只會把你需要的那部分鏈結進去,應用程式相對比較大。但是如果多個應用程式使用的話,會被裝載多次,浪費記憶體。
總上,如果你的系統上有多個應用程式都使用該庫的話,就把它編譯成動態庫,這樣雖然剛啟動的時候載入比較慢,但是多工的時候會比較節省記憶體;如果你的系統上只有一到兩個應用使用該庫,並且使用的api比較少的話,就編譯成靜態庫吧,一般的靜態庫還可以進行裁剪編譯,這樣應用程式可能會比較大,但是啟動的速度會大大提高。
動態鏈結庫和靜態鏈結庫的區別
平時總聽人講動態鏈結庫 靜態鏈結庫 lib dll so等名詞,一直搞不清楚這幾者之間的區別以及各自的應用場合。後來上網仔細查了一下資料,終於搞清楚了,在這裡整理一下先。動態鏈結庫 動態鏈結庫中包含了多個已經被編譯 鏈結好的函式和資料資源,但並不包含函式的原始碼。動態鏈結庫在windows下是.dl...
動態鏈結庫和靜態鏈結庫的區別
本文我們學習和了解一下動態鏈結庫和靜態鏈結庫的區別。靜態鏈結庫 lib檔案 將函式 編譯到應用程式中,應用程式執行時全部載入到記憶體。優點是不需要掛在dll檔案,缺點是生成的應用程式比較大。動態鏈結庫 lib和dll檔案 lib編譯到應用程式中,實際函式 寫在dll中。在應用程式執行時,lib只是用...
flex的動態鏈結庫和靜態鏈結庫
flex可以有兩種庫,一種是動態鏈結庫 rsl 一種是靜態鏈結庫。我們通常使用的swc是靜態鏈結庫,編譯的時候會直接把需要的東西編進去,包含在生成的swf中。swc檔案是一種壓縮檔案格式,裡面包含乙個library.swf 檔案乙個catalog.xml檔案。這其中包含的.swf檔案可以單提出來當成...