-
什么是庫?
- 庫是現有的、成熟的、可以復用的代碼。現實中每個程序都要依賴很多的底層庫。
- 本質上來講,庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。
-
將一個源文件編譯鏈接成一個可執行文件的步驟:
-
靜態鏈接
-
為什么要進行靜態鏈接
- 在實際開發中,不可能將所有代碼放在一個源文件中,所以會出現多個源文件。
- 而且多個源文件之間會存在多種依賴關系,如一個源文件可能要調用另一個源文件中定義的函數。
- 但是每個源文件都是獨立編譯的,即每個.cpp文件會形成一個.o文件,為了滿足依賴關系,需要將這些源文件產生的目標文件進行鏈接,從而形成一個可執行程序。
-
靜態鏈接的原理
-
靜態鏈接的缺點
- 浪費空間,因為每個可執行程序對需要的目標文件都有有一份副本,所以如果多個程序對同一個目標文件都有依賴,這個目標文件會在內存中有多個副本。
- 更新比較困難,因為每當庫函數的代碼被修改,就需要重新進行編譯鏈接形成可執行程序。
-
靜態鏈接的優點:
- 在可執行程序中已經具備了所有執行程序所需要的任何東西,在執行的時候運行速度快。
-
-
動態鏈接
- 為什么會出現動態鏈接
- 解決靜態鏈接中出現的兩個問題:一是空間浪費,二是更新困難。
- 動態鏈接的原理
- 動態鏈接的基本思想是把程序按照模塊拆分成各個相對獨立部分,在程序運行時才將它們鏈接在一起形成一個完成的程序,而不是像靜態鏈接一樣把所有程序模塊都鏈接成一個單獨的可執行文件。
- 假設有兩個程序program1.o和program2.o,它們共用同一個庫lib.o。假設首先運行程序program1,系統首先加載program1.o,當系統發線program1.o中用到了lib.o,那么系統接着加載lib.o。當program2.o運行時,同樣的加載program2.o,然后發現program2.o依賴於lib.o,但是此時lib.o已經存在於內存中,那么此時不再重新加載,而是將內存中已經存在的lib.o映射到program2的虛擬地址空間中,從而進行鏈接形成可執行文件。
- 動態鏈接的缺點
- 因為把鏈接推遲到了程序運行時,所以每次執行程序都需要進行鏈接,所以性能會有一定損失。
- 動態鏈接的優點
- 節省空間。因為即使所有程序都依賴都一個庫,但是該庫在內存中只存在一個副本。
- 更新方便,因為更新時只需要替換原來的目標文件,而無需將所有的程序再重新鏈接一遍。當程序下一次運行時,新版本的目標文件會自動加載到內存中並且鏈接起來。
- 為什么會出現動態鏈接