導入庫和靜態庫的區別

2021-06-20 08:13:41 字數 1406 閱讀 3835

導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

1靜態庫

2導入庫和靜態庫的區別

目前以lib字尾的庫有兩種,一種為

靜態鏈結庫(static library,以下簡稱「靜態庫」),另一種為

動態連線庫(dll,以下簡稱「動態庫」)的導入庫(import library,以下簡稱「導入庫」)。

靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併到一起。比如你鏈結乙個

靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。

動態庫一般會有對應的導入庫,方便程式

靜態載入

動態鏈結庫,否則你可能就需要自己loadlibrary調入

dll檔案,然後再手工getprocaddress獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、

符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

這也是實際上很多開

源**發布的慣用方式:

1. 預編譯的開發包:包含一些.

dll檔案和一些.lib檔案。其中這裡的.lib就是導入庫,而不要錯以為是

靜態庫。但是引入方式和

靜態庫一樣,要在鏈結路徑上新增找到這些.lib的路徑。而.dll則最好放到最後產生的應用程式exe執行檔案相同的目錄。這樣執行時,就會自動調入

動態鏈結庫。

源**,按照readme自己編譯。生成很可能也是.dll + .lib(導入庫)的庫檔案

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

當dll被鏈結時,鏈結程式要查詢關於輸出

變數,函式,或c++類的資訊,並自動生成乙個lib檔案。該lib檔案包含乙個dll輸出的符號列表。如果要鏈結引用該dll的輸出符號的任何可執行模組,該lib檔案是必不可少的(使用getprocaddress除外)。

其實導入庫中並不含rva(每個符號的

相對虛擬位址),只是一些符號而已,還有關於這個lib所對應的dll的名字等。 (這只是我現在的理解)

那當應用程式呼叫乙個dll的函式時,是怎麼進行的呢?(使用lib的情況下)

答案是在程序的

主線程開始執行之前,由載入器完成。

載入器根據輸入節中dll的名字按照windows的搜尋路徑搜尋dll,找到後dll對映到程序的

位址空間,這是dll中對應於輸入節中的各個符號的位址就可以確定了,載入器在這個時候將位址重新填入可執行模組的輸入節中,動態連線完成。

導入庫和靜態庫的區別

導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。目前以lib字尾的庫有兩種,一種為靜態鏈結庫 static library,以下簡稱 靜態庫 另一種為動態連線庫 dll,以下簡稱 動態庫 的導入庫 import library,以下簡稱 導入庫 靜態庫是乙個或者多個obj檔案的打...

動態庫和靜態庫的區別

一 什麼是庫?庫是共享程式 的方式,一般分為靜態庫和動態庫。靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,多個程式共用,節省記憶體。二 靜態庫和動態庫的好處 使用靜態庫的好處 至於蘋果為啥禁止i...

動態庫和靜態庫的區別

靜態庫 在程式編譯時會被鏈結到 中,程式執行時將不再需要靜態庫。字尾是lib 靜態庫的生成 生成靜態庫的時候要使用.o檔案來進行編譯生成 gcc cprint.c oprint.o ar rc libtest.a print.o gccmain.c l.ltest omain 動態庫 在程式編譯並不...