文章目錄
- 1 預處理
- 2 編譯
- 3 彙編
- 4 連結
文法: gcc [選項] 要編譯的檔案 [選項] [目标檔案]
功能: 将進階語言翻譯為機器語言。
執行步驟:
1 預處理
展開代碼(進行宏替換)
- 預處理功能主要包括宏替換、替換頭檔案、條件編譯、删除注釋等。
- 執行個體:
gcc -E 檔案名 -o 檔案名.i
- 選項’-E’ 作用是讓gcc在預處理結束後停止編譯。
2 編譯
生成彙編代碼
- 在這個階段中,gcc首先要檢查代碼的規範性、是否有文法錯誤等,檢查無誤後,将代碼翻譯為彙編語言。
- 執行個體:
gcc -S 檔案名.i -o 檔案名.s
3 彙編
将彙編代碼編譯稱為機器可識别的指令
- 執行個體:
gcc -c 檔案名.s -o 檔案名.o
前面三步隻是将自身代碼編譯稱為機器代碼,但是在我們的代碼中有許多調用函數,比如printf、malloc、等,這些函數都不是我們自己實作的,但是如果我們要生成最後的可執行程式,那麼就必須在我們的代碼中知道這些函數的實作。
最後的答案是:系統把這些函數實作做到名為libc.so.6的庫檔案中去了,在沒有特别指定時,gcc會到系統預設的搜尋路徑“/usr/lib”下進行查找,也就是連結到libc.so.6庫函數中去,這樣就能實作函數了。
4 連結
生成可執行檔案或函數庫
- 執行個體:
gcc 檔案名.o -o 檔案名
函數庫一般分為靜态庫和動态庫兩種
**靜态庫:**将庫中的代碼全部拿過來跟我們的代碼一起寫入最終的可執行程式,最終生成的可執行程式比較大,但運作時不需要依賴庫檔案。
**動态庫:**記錄函數位址資訊,并不是将代碼全部拿過來,是以可執行程式比較短,但是需要依賴庫檔案。
gcc預設動态連結!