什麼是庫?
庫是寫好的現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。
所謂靜態、動態是指鏈接。回顧一下,將一個程序編譯成可執行程序的步驟:
靜態庫:
之所以成為【靜態庫】,是因為在鏈接階段,會將匯編生成的目標文件.o與引用到的庫一起鏈接打包到可執行文件中。因此對應的鏈接方式稱為靜態鏈接。
試想一下,靜態庫與匯編生成的目標文件一起鏈接為可執行文件,那麼靜態庫必定跟.o文件格式相似。其實一個靜態庫可以簡單看成是一組目標文件(.o/.obj文件)的集合,即很多目標文件經過壓縮打包後形成的一個文件。靜態庫特點總結:
1、靜態庫對函數庫的鏈接是放在編譯時期完成的。
2、程序在運行時與函數庫再無瓜葛,移植方便。
3、浪費空間和資源,因為所有相關的目標文件與牽涉到的函數庫被鏈接合成一個可執行文件。
通過上面的介紹發現靜態庫,容易使用和理解,也達到了代碼復用的目的,那為什麼還需要動態庫呢?
為什麼需要動態庫,其實也是靜態庫的特點導致。
1、空間浪費是靜態庫的一個問題。
2、另一個問題是靜態庫對程序的更新、部署和發布頁會帶來麻煩。如果靜態庫liba.lib更新了,所以使用它的應用程序都需要重新編譯、發布給用戶(對於玩家來說,可能是一個很小的改動,卻導致整個程序重新下載,全量更新)。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入。不同的應用程序如果調用相同的庫,那麼在內存裡只需要有一份該共享庫的實例,規避了空間浪費問題。動態庫在程序運行是才被載入,也解決了靜態庫對程序的更新、部署和發布頁會帶來麻煩。用戶只需要更新動態庫即可,增量更新。
動態庫特點總結:
1、動態庫把對一些庫函數的鏈接載入推遲到程序運行的時期。
2、可以實現進程之間的資源共享。(因此動態庫也稱為共享庫)
3、將一些程序升級變得簡單。
4、甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制(顯示調用)。