lib和dll的關係

2021-06-04 17:54:55 字數 2663 閱讀 6399

**:

lib是和dll對應的。lib是靜態鏈結庫的庫檔案,dll是動態鏈結庫的庫檔案。

所謂靜態就是link的時候把裡面需要的東西抽取出來安排到你的exe檔案中,以後執行你的exe的時候不再需要lib。

所謂動態就是exe執行的時候依賴於dll裡面提供的功能,沒有這個dll,你的exe無法執行。

lib,dll,exe都算是最終的目標檔案,是最終產物。而c/c++屬於源**。源**和最終目標檔案中過渡的就是中間**obj,實際上之所以需要中間**,是你不可能一次得到目標檔案。比如說乙個exe需要很多的cpp檔案生成。而編譯器一次只能編譯乙個cpp檔案。這樣編譯器編譯好乙個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統一link成所需要的exe,應該說缺少任意乙個obj都會導致exe的鏈結失敗。

1.obj裡存的是編譯後的**跟資料,並且有名稱,所以在連線時有時會出現未解決的外部符號的問題。當連成exe後便不存在名稱的概念了,只有位址。lib就是一堆obj的組合。

2.理論上可以連線obj檔案來引用其他工程(可以認為乙個obj檔案等價於編譯生成它的cpp檔案,可以引用obj來替換cpp,也可以新增cpp來替換obj ),但實際中通常用lib來實現工程間相互引用。

3.編譯器會預設鏈結一些常用的庫,其它的需要你自己指定。

lib和dll的區別

(1)lib是編譯時需要的,dll是執行時需要的。如果要完成源**的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了 。在開發和除錯階段,當然最好都有。

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

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

dll內的函式分為兩種:

(1)dll匯出函式,可**用程式呼叫;

(2)dll內部函式,只能在dll程式使用,應用程式無法呼叫它們

建立靜態鏈結庫和建立動態鏈結庫

vc6中建立[win32 dynamic-link library]工程便可以建立出乙個空的dll工程.

vc6中建立[win32 static library]工程便可以建立出乙個空的lib工程(靜態鏈結庫工程,僅生成乙個lib檔案).

新增lib檔案的常用辦法有二個:

1、把*.lib放在vc的lib目錄中

2、修改project setting的link->input中的addtional library path,加入你的目錄dll:是可實際執行的二進位制**,有定位**的!

3、也可以在object/library中直接寫上lib檔案路徑.(這裡實際上是可以寫上任意obj檔案或者lib檔案的).

.h標頭檔案是編譯時必須的,lib是鏈結時需要的,dll是執行時需要的。

附加依賴項的是.lib不是.dll,若生成了dll,則肯定也生成 lib檔案。如果要完成源**的編譯和鏈結,有標頭檔案和lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。

.h .lib .dll三者的關係

h檔案作用是:宣告函式介面

dll檔案作用是: 函式可執行**

當我們在自己的程式中引用了乙個h檔案裡的函式,編鏈器怎麼知道該呼叫哪個dll檔案呢?這就是lib檔案的作用: 告訴鏈結器 呼叫的函式在哪個dll中,函式執行**在dll中的什麼位置 ,這也就是為什麼需要附加依賴項 .lib檔案,它起到橋梁的作用。如果生成靜態庫檔案,則沒有dll ,只有lib,這時函式可執行**部分也在lib檔案中

目前以lib字尾的庫有兩種,一種為靜態鏈結庫(static libary,以下簡稱「靜態庫」),另一種為動態連線庫(dll,以下簡稱「動態庫」)的導入庫(import libary,以下簡稱「導入庫」)。靜態庫是乙個或者多個obj檔案的打包 ,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併到一起。比如你鏈結乙個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。動態庫一般會有對應的導入庫,方便程式靜態載入動態鏈結庫 ,否則你可能就需要自己loadlibary調入dll檔案,然後再手工getprocaddress獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

lib和dll的關係

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

windows下lib與dll關係

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

lib和dll的區別

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