靜態鏈結和動態鏈結區別

2021-05-01 04:15:19 字數 806 閱讀 8105

一、靜態鏈結

鏈結程式搜尋乙個或者多個庫檔案(標準庫.lib),直到在某個庫中找到了含有所引用函式的物件模組,然後鏈結程式把這個物件模組拷貝到結果可執行檔案(.exe)中。鏈結程式維護對該函式的所有引用,使它們指向該程式中現在含有該函式拷貝的地方。

二、動態鏈結

鏈結程式也是搜尋乙個或者多個庫檔案(輸入庫.lib),當在某個庫中找到了所引用函式的輸入記錄時,便把輸入記錄拷貝到結果可執行檔案中,產生一次對該函式的動態鏈結。這裡,輸入記錄不包含函式的**或者資料,而是指定乙個包含該函式**以及該函式的順序號或函式名的動態鏈結庫。

當程式執行時,windows裝入程式,並尋找檔案中出現的任意動態鏈結。對於每個動態鏈結,windows裝入指定的dll並且把它對映到呼叫程序的虛擬位址空間(如果沒有對映的話)。因此,呼叫和目標函式之間的實際鏈結不是在鏈結應用程式時一次完成的(靜態),相反,是執行該程式時由windows完成的(動態)。這種動態鏈結稱為載入時動態鏈結。鏈結動態鏈結庫裡的函式的方法如下:

如上所述。windows搜尋要裝入的dll時,按以下順序:

應用程式所在目錄→當前目錄→windows system目錄→windows目錄→path環境變數指定的路徑。

程式設計師使用loadlibrary把dll裝入記憶體並且對映dll到呼叫程序的虛擬位址空間(如果已經作了對映,則增加dll的引用計數)。首先,loadlibrary搜尋dll,搜尋順序如同載入時動態鏈結一樣。然後,使用getprocessaddress得到dll中輸出函式的位址,並呼叫它。最後,使用freelibrary減少dll的引用計數,當引用計數為0時,把dll模組從當前程序的虛擬空間移走。

靜態鏈結和動態鏈結的區別

靜態庫和動態庫的比較 鏈結靜態庫其實從某種意義上來說也是一種貼上複製,只不過它操作的物件是目標 而不是原始碼而已。因為靜態庫被鏈結後庫就直接嵌入可執行檔案中了,這樣就帶來了兩個問題。首先就是系統空間被浪費了。這是顯而易見的,想象一下,如果多個程式鏈結了同乙個庫,則每乙個生成的可執行檔案就都會有乙個庫...

靜態鏈結和動態鏈結的區別

靜態鏈結是指要把呼叫的函式或過程直接拷貝到可執行檔案中,成為可執行檔案的一部分。缺點 當多個程式都要呼叫相同函式時,記憶體中就會有多個拷貝,浪費了記憶體資源。優點 執行速度快,執行程式能夠在其他作業系統的機器上直接執行。動態鏈結 動態鏈結是所呼叫的函式 並沒有拷貝到應用程式的可執行檔案中,而是僅僅在...

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...