一個C程序的編譯過程(Linux環境下Gcc)

一 以下是C程序一般的編譯過程:


 

 從圖中看到:

      將編寫的一個c程序(源代碼 )轉換成可以在硬件上運行的程序(可執行代碼 ),需要進行編譯階段  和鏈接這兩個階段。

      其中,

      1.  編譯階段先通過“編譯器 “把一個 .c / .cpp 源代碼 編譯成 .s的彙編代碼 ;再經過“彙編器 ” 把這 個.s的彙編代碼彙編成 .o 的 目標代碼

      2.  “連接器 “ 通過連接其他 .o 代碼(如果需要的話) 庫文件 和 1 中的.o 目標代碼生成可執行文件

該文件流被這三種程序(紅色)的加工,分別表現出四種形式(藍色) ,這就是c程序的編譯和鏈接過程。如果再詳細的話,編譯器在將源文件編譯成彙編文件的過程又分爲:預處理階段(生成 .i代碼) 和  優化階段

 


二、C編程中的文件後綴名介紹

    .c 未經過預處理的C源碼
    .h C頭文件  
    .i 經過預處理的C源碼

    .s 生成的彙編語言代碼 
    .o 編譯之後產生的目標文件
    解釋:*.c一般使我們自己編輯的代碼,使我們勞動的結晶;*.h一般是我們手工生成的接口文件,如果願意,也可在*.c完成後用GCC的選項-aux-info幫我們生成;*.i是經過預處理後的源碼,是由GCC在選項-E編譯下自動生成的文件;*.o是編譯後產生的目標文件;*.s是GCC在選項-S編譯下生成的彙編語言代碼,對於性能要求很高的程序可以先生成彙編語言文件並對彙編做優化,然後用優化後的彙編生成目標文件並鏈接

 


三 演示 hello.c 的編譯 過程(Linux 下 Gcc)

    

         本小節的演示都針對文件 hello.c 進行

   1. /*
   2.  * hello.c
   3.  */
   4.
   5.   #include <stdio.h>
   6.   int  main()
   7.   {
   8.     printf("
 
Better goal, Better life! /n");
   9.     return 0;
  10.   }


  1.生成預處理後的文件 hello.i

     gcc -E hello.c -o hello.i

  2 .生成彙編語言文件 hello.s

      gcc -s hello.i -o hello.s

   3.生成目標文件 hello.o

      $ gcc -c hello.i
      $ gcc -c hello.s

   4. 生成可執行文件

      $ gcc -o hello hello.o

   5. 運行及結果

      $ ./hello

      Better goal, Better life!

當然也可以直接生成, $ gcc -c hello.c  就可以生成可執行文件。這是Gcc內部的事。但就算是跳躍也要經過一步步的翻譯, 原理是相似的,萬變不離其宗!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章