靜態庫與共享庫的區別 程序 作業系統 記憶體

2021-08-09 17:42:13 字數 1416 閱讀 4906

1.

靜態庫與共享庫的區別

一些問題:

1)如果主機上沒有libfoo.a 那麼main程式能不能執行?

可以執行

2)如果foo庫更新了,需要將原來的main.c重新編譯生成main可執行程式

3)比使用共享庫,程式要稍微大一點

2.共享庫

共享庫在windows上叫做動態鏈結庫

一些問題:

1)如果主機沒有libfoo.so,那麼main程式是不能執行的。因為./main執行的時候才會去裝載add方法

2)如果更新了libfoo.so庫,那麼main程式

2.如果更新了libfoo.so庫,那麼main程式不需要重新編譯,直接就可以使用新庫。

3.由於庫里的方法並沒有包含在可執行程式中,所以,程式相對較小。

問題:如果庫里有兩個方法,而程式中只用到了乙個方法,那麼,在使用兩種不同庫的時候,是把兩個方法都包含在內,還是只包含使用的那個方法?

4.nm main

nm命令可以檢視程式中,變數和函式的位址。那麼這是什麼位址?邏輯位址?實體地址?

3.程序

作業系統管理程序,依靠pcb(程序控制塊)

cpu、io、記憶體由匯流排連線

計算機組成:cpu(運算器、控制器)、記憶體(儲存器)、io(輸入輸出裝置)

匯流排:位址匯流排、資料匯流排、控制匯流排

程式由指令構成

4.作業系統:管理軟硬體資源,為使用者提供乙個互動的介面。

1)序列處理  任務 == 程序

2)批處理系統   不能換程式

3)多道程式設計    如果a程式阻塞了,可以換成b程式

這個過程也是硬體發展的結果

4)分時系統   

5.  記憶體:分頁、分段、段頁式、夥伴系統         1kb = 1024byte(位元組)

q:引入虛擬記憶體以後,有什麼不同?

6.  printf()列印情況:

1)緩衝區放滿了

2)沒放滿,但是強制重新整理(比如加\n)

3)程式結束的時候(exit(0)   _exit(0):沒有重新整理緩衝區)

7.  主函式三個引數

比如:int main(int argc,char *argv,char *envp)

{// argc:傳遞給主函式的引數個數

//argv是乙個代表引數自身的字串陣列  

//envp:環境變數,由父程序傳給

靜態庫與共享庫

編寫使用靜態庫 靜態庫 共享庫 是包含了目標檔案的檔案,這些目標檔案被稱為模板或成員,是可以重用的預編譯 它們以特殊的格式和乙個表或者對映儲存在一起,這個表或者對映將符號名和儲存該符號的成員名字鏈結起來。對映加速了編譯和鏈結過程,靜態庫一般以副檔名.a 代表存檔檔案,archive 命名。為了使用庫...

靜態庫與共享庫

1.靜態庫 所有編譯器都提供一種機制,將所有相關的目標檔案模組兒打包成乙個單獨的檔案,被稱為靜態庫。它可以用作來聯結器的輸入,當聯結器構造乙個輸入的可執行檔案時,它只拷貝靜態庫裡面被應用程式引用的模組兒。在unix 系統中,靜態庫以存檔 一組連線起來的可重定位目標檔案的集合,有乙個頭部來描述成員目標...

靜態庫與共享庫

庫library 靜態庫在編譯連線時就把庫里的 提取出來放入可執行檔案中,程式執行時不再依賴庫。動態庫在編譯連線時只記錄了要用的名字在哪個庫的檔案中,執行時才庫檔案中找這個檔案中名字 函式或變數 並且訪問它 1 靜態庫 歸檔 lib a 1 生成庫 gcc c 1.c 2.c 只編譯不連線,產生.o...