庫是寫好的現有的,成熟的,可以復用的**。現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,因此庫的存在意義非同尋常。
本質上來說庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種:靜態庫.lib和動態庫.dll ,所謂靜態、動態是指鏈結。下圖是程式編譯的過程
動態庫是lib包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的dll提供。
靜態庫是lib包含函式**本身,在編譯時直接將**加入程式當中,稱為靜態鏈結庫。(所以無論是動態鏈結庫還是靜態鏈結庫,都會有lib檔案)
之所以叫靜態鏈結庫,是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟.o檔案格式相似,其實乙個靜態庫可以簡單看成是一組目標檔案(.o/.obj檔案)的集合。
靜態鏈結庫的特點:動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項(如下圖),規避了空間浪費問題。動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。
動態鏈結庫的使用:
標頭檔案.h和靜態鏈結庫使用時的作用一樣,使用動態鏈結庫中的函式的專案需要引用該檔案才能編譯通過;
.lib包含了函式所在的dll檔案和檔案中函式位置的資訊,.dll包含了實際執行**、符號表等等;
載入lib的方法:lib是編譯鏈結是用的,跟使用靜態鏈結庫時一樣有兩種方法:法1:使用編譯鏈結引數或者vs的配置屬性來設定 ;
法2:使用pragma編譯語句,例如pragma comment(lib,「a.lib」);
載入dll的方法:dll是執行時用的,鏈結了lib之後形成的exe可執行檔案中已經有了dll的資訊,所以只要把dll放在和exe同乙個目錄下就可以了,執行時根據exe需要自動載入dll中的函式。
動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期,可以實現程序之間的資源共享,將一些程式公升級變得簡單。
動態鏈結庫與靜態鏈結庫
有人會想,動態鏈結這樣麻煩,為什麼還要用呢?這裡有乙個技術問題,對這個問題的解決直接導致了動態載入的需求。問題是有些dll只在某個windows版本中存在,或某個api只在某些windows版本中被加入指定的dll。當你使用靜態鏈結的.exe試圖在不支援的windows版本上執行時,系統會彈出系統對...
動態鏈結庫與靜態鏈結庫
原貼出處 http blog.csdn.net benny5609 archive 2008 04 17 2298998.aspxs 還有參考 http msdn.microsoft.com zh cn library 1ez7dh12 v vs.100 aspxs 首先通過乙個簡單的靜態鏈結庫的例...
靜態鏈結 庫 與動態鏈結 庫
靜態鏈結與動態鏈結 簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態鏈結,顧名思義就是在應用程式啟動的時候才會鏈結,所以,當使用者的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點 動態庫 1.共享 多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要...