動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

2021-05-08 04:12:12 字數 1727 閱讀 2848

目前以lib字尾的庫有兩種,一種為靜態鏈結庫(static libary,以下簡稱「靜態庫」),另一種為動態連線庫(dll,以下簡稱「動態庫」)的導入庫(import libary,以下簡稱「導入庫」)。

靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併到一起。比如你鏈結乙個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。

動態庫一般會有對應的導入庫,方便程式靜態載入動態鏈結庫,否則你可能就需要自己loadlibary調入dll檔案,然後再手工getprocaddress獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

這也是實際上很多開源**發布的慣用方式:

1. 預編譯的開發包:包含一些.dll檔案和一些.lib檔案。其中這裡的.lib就是導入庫,而不要錯以為是靜態庫。但是引入方式和靜態庫一樣,要在鏈結路徑上新增找到這些.lib的路徑。而.dll則最好放到最後產生的應用程式exe執行檔案相同的目錄。這樣執行時,就會自動調入動態鏈結庫。

3. 如果你只有dll,並且你知道dll中函式的函式原型,那麼你可以直接在自己程式中使用loadlibary調入dll檔案,getprocaddress

dll:

動態鏈結庫 (dll) 是作為共享函式庫的可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。dll 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個 dll 副本的內容。

動態鏈結與靜態鏈結的不同之處在於它允許可執行模組(.dll 檔案或 .exe 檔案)僅包含在執行時定位 dll 函式的可執行**所需的資訊。在靜態鏈結中,鏈結器從靜態鏈結庫獲取所有被引用的函式,並將庫同**一起放到可執行檔案中。

使用動態鏈結代替靜態鏈結有若干優點。dll 節省記憶體,減少交換操作,節省磁碟空間,更易於公升級,提供售後支援,提供擴充套件 mfc 庫類的機制,支援多語言程式,並使國際版本的建立輕鬆完成。

靜態鏈結舉例用的.lib其實是win特有的,屬於歷史遺留問題,這樣鏈結的庫最後再執行時仍然是載入的.dll,只不過是由系統完成裝配。而靜態鏈結則是你說的第一種,鏈結完成後就不需要庫檔案也可以執行了。完全是win的鏈結方式把你搞迷糊了,考慮一下linux/unix平台就知道了,靜態庫.a,動態庫.so,沒有第三種形態。動態庫也可不鏈結動態載入。可以說鏈結有兩種形式,靜態和動態。動態庫載入有兩種方式,執行時系統裝配和執行時動態載入。不能混為一談。

可以說windows提供了三種方法:

1.use static libary 此時被呼叫函式的**將會被打包進可執行檔案。

2.static linked dll 此時動態連線庫(dll,「動態庫」)的導入庫(import libary,「導入庫」)將會被打包入可執行檔案,而動態庫(包含有被呼叫函式的**實現)將會在程式被載入到記憶體時載入到記憶體。

3. dynamic linked dll,僅在程式需要時載入被呼叫函式的**實現到記憶體,且可隨時解除安裝。故比方法2節省記憶體。

方法1,2打包進去的都是lib檔案,但他們是不同的。lib檔案有兩種,靜態庫(static libary) 和dll的導入庫(importlibary)。前者是有函式實現的,後者沒有。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...