編譯和鏈結(lib和dll區別)

2021-06-07 03:42:49 字數 1777 閱讀 3908

編譯和鏈結(lib和dll區別)

一、前言

初學動態鏈結庫時,總被許多概念搞得一塌糊塗,比如「隱式鏈結」,「動態載入」,lib靜態庫和lib導入庫。雖然會用,但概念還是很模糊的。後來了解了編譯和鏈結的一些原理,總算有乙個比較清晰的理解,整理出來和大家分享。若有不對之處,還望斧正!謝謝!

五.總結

1.標頭檔案並不參加鏈結和編譯。編譯器第一步要做的就是簡單的把頭檔案在包含它的原始檔中展開。不知你是否能理解這句話。也就是標頭檔案裡面有什麼內容,通通把它移到包含這個標頭檔案的原始檔裡。(我覺得這是個很重要的概念,可以幫助我們簡化理解編譯鏈結的過程,包括理解標頭檔案中定義靜態變數或靜態函式是怎麼回事)。編譯器經過這一步轉換後剩下什麼呢?就是一堆cpp檔案了。而標頭檔案已經不再是編譯器需要關心的東西了。編譯器接下來就要處理這一堆cpp檔案了。

2.接著編譯器呼叫cl.exe編譯所有的cpp檔案並生成對應的obj檔案。每個obj裡面有很多函式,但並不是每個函式都有具體的實現**,有些函式的實現是在其它的obj或dll或lib裡面實現的。

3.最後編譯器呼叫link.exe鏈結所有的obj並生成exe檔案。在鏈結obj模組時,如果發現有函式符號標識,就去其他模組尋找標識指向的函式實體。link後,所有函式在程式**中佔據乙個。而原先obj中的標識就變成指向相應函式的位址。

4.要區分lib靜態庫和lib導入庫的區別。

dll顯式載入,當程式需要呼叫到某個函式時才去載入動態鏈結庫

六.什麼是lib檔案,lib和dll的關係如何 (來自網路)

(1)lib是編譯時需要的,dll是執行時需要的。

如果要完成源**的編譯,有lib就夠了。

如果也使動態連線的程式執行起來,有dll就夠了。

在開發和除錯階段,當然最好都有。

(2)一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。

(3)在動態庫的情況下,有兩個檔案,乙個是引入庫(.lib)檔案,乙個是dll檔案,引入庫檔案包含被dll匯出的函式的名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到所需要使用的dll檔案,dll庫中的函式和資料並不複製到可執行檔案中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式**和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.lib檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

lib和dll的區別

1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有d...

lib和dll的區別

關於lib和dll的區別如下 1 lib是編譯時用到的,dll是執行時用到的。如果要完成源 的編譯,只需要lib 如果要使動態鏈結的程式執行起來,只需要dll。2 如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容 如果只有lib檔案,那麼這個l...

lib 和 dll 的區別

首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最...