天天看點

Linux----gcc工具的使用(預處理、編譯、彙編、連結)1 預處理2 編譯3 彙編4 連結

文章目錄

  • 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預設動态連結!

繼續閱讀