動態連結程式庫和靜態連結庫詳解

來源:互聯網
上載者:User

 

一、分別編譯與連結(Linking

大多數進階語言都支援分別編譯,程式員可以顯式地把程式劃分為獨立的模組或檔案,然後每個獨立部分分別編譯。在編譯之後,由連結器把這些獨立的片段(稱為編譯單元)“粘接到一起”。(想想這樣做有什麼好處?)

在C/C++中,這些獨立的編譯單元包括obj檔案(一般的來源程式編譯而成)、lib檔案(靜態連結的函數庫)、dll檔案(動態連結的函數庫)等。

靜態連結方式:在程式執行之前完成所有的組裝工作,產生一個可執行檔目標檔案(EXE檔案)。

動態連結方式:在程式已經為了執行被裝入記憶體之後完成連結工作,並且在記憶體中一般只保留該編譯單元的一份拷貝。

二、靜態連結庫與動態連結程式庫

先來闡述一下DLL(Dynamic Linkable Library)的概念,你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變數、函數或類。

靜態連結庫與動態連結程式庫都是共用代碼的方式,如果採用靜態連結庫,則無論你願不願意,lib中的指令都被直接包含在最終產生的EXE檔案中了。但是若使用DLL,該DLL不必被包含在最終的EXE檔案中,EXE檔案執行時可以“動態”地引用和卸載這個與EXE獨立的DLL檔案。

採用動態連結程式庫的優點:(1)更加節省記憶體;(2)DLL檔案與EXE檔案獨立,只要輸出介面不變,更換DLL檔案不會對EXE檔案造成任何影響,因而極大地提高了可維護性和可擴充性。

三、靜態連結庫的製作

   具體情況詳見以前文章,常用的標準C庫函數(scanf、printf、memcpy、strcpy等)就來自這種靜態庫。

四、靜態連結庫的調用

#pragma comment( lib ,
"libTest.lib" )的意思是指本檔案產生的.obj檔案應與libTest.lib一起串連。如果不用#pragma comment指定,則可以直接在VC++中設定,依次選擇tools、options、directories、library
files菜單或選項,填入庫檔案路徑

靜態連結庫的例子至少讓我們明白了庫函數是怎麼回事,它們是哪來的。我們現在有下列模糊認識了:

(1)庫不是個怪物,編寫庫的程式和編寫一般的程式區別不大,只是庫不能單獨執行;

(2)庫提供一些可以給別的程式調用的東東,別的程式要調用它必須以某種方式指明它要調用之。

以上從靜態連結庫分析而得到的對庫的懵懂概念可以直接引申到動態連結程式庫中,動態連結程式庫與靜態連結庫在編寫和調用上的不同體現在庫的外部介面定義及調用方式略有差異。

五、認識動態連結程式庫

動態連結是相對於靜態連結而言的。所謂靜態連結是指把要調用的函數或者過程連結到可執行檔中,成為可執行檔的一部分。換句話說,函數和過程的代碼就在程式的exe檔案中,該檔案包含了運行時所需的全部代碼。當多個程式都調用相同函數時,記憶體中就會存在這個函數的多個拷貝,這樣就浪費了寶貴的記憶體資源。而動態連結所調用的函數代碼並沒有被拷貝到應用程式的可執行檔中去,而是僅僅在其中加入了所調用函數的描述資訊(往往是一些重定位資訊)。僅當應用程式被裝入記憶體開始運行時,在Windows的管理下,才在應用程式與相應的DLL之間建立連結關係。當要執行所調用DLL中的函數時,根據連結產生的重定位資訊,Windows才轉去執行DLL中相應的函數代碼。一般情況下,如果一個應用程式使用了動態連結程式庫,Win32系統保證記憶體中只有DLL的一份複製品

動態連結程式庫的兩種連結方法:

(1) 裝載時動態連結(Load-time Dynamic Linking):這種用法的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時間在目標檔案中只保留必要的連結資訊,而不含DLL函數的代碼;當程式執行時,利用連結資訊載入DLL函數代碼並在記憶體中將其連結入調用程式的執行空間中,其主要目的是便於代碼共用。

(2) 運行時動態連結(Run-time Dynamic Linking):這種方式是指在編譯之前並不知道將會調用哪些DLL函數,完全是在運行過程中根據需要決定應調用哪個函數,並用LoadLibrary和GetProcAddress動態獲得DLL函數的入口地址。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.