庫是寫好的現有的,成熟的,可以復用的**。現實中每個程式都要依賴很多基礎的底層庫。
先回顧一下編譯過程:
靜態庫在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中,對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案(.o檔案)一起鏈結為可執行檔案,那麼靜態庫必定跟.o檔案格式相似。其實乙個靜態庫可以
簡單看成是一組目標檔案(.o/.obj檔案)的歸檔集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。靜態庫特點總結:
1、靜態庫對函式庫的鏈結是放在編譯時期完成的。
2、程式在執行時與函式庫再無瓜葛,移植方便。
3、浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案。
除了上面提到的浪費空間和資源的弊端,使用靜態庫還有另乙個問題:對程式的更新、部署和發布頁會帶來麻煩。如果靜態庫libtest.a更新了,所有使用它的應用程式都需要重新編譯、發布給使用者。
通過上面的介紹發現靜態庫,容易使用和理解,也達到了**復用的目的,那為什麼還需要動態庫呢?
為什麼需要動態庫,其實也是靜態庫的特點導致。
l 空間浪費是靜態庫的乙個問題。
動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題。動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。
動態庫特點總結:
l 動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期。
l 可以實現程序之間的資源共享。(因此動態庫也稱為共享庫)
l 將一些程式公升級變得簡單。
l 甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)。
C 靜態庫與動態庫
感覺比較形象,就摘過來了.這次分享的 宗旨是 讓大家學會建立與使用靜態庫 動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫 動態庫的底層格式,記憶體布局等,有興趣的同學,推薦一本書 程式設計師的自我修養 鏈結 裝載與庫 庫是寫好的現有的,成熟的,可以復用的 現實中每個程...
C 靜態庫與動態庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll 所謂靜態 動態是指鏈結。回顧一下,將乙個程...
c 靜態庫與動態庫
庫分為靜態庫,動態庫,在不同系統下字尾不同。2.1.1 在鏈結和執行階段都涉及庫的呼叫 訪問 h檔案 標頭檔案 是庫的介面。h檔案提供給庫的使用者,使用者通過.h來呼叫庫中的api。2.1.2 庫中包含的是函式的實現 一堆函式的實現 這些函式在編寫的時候同樣要包含1中的標頭檔案,然後生成庫。2.1....