C程序的編譯過程

1、前言

如果你使用的是集成開發環境,那麼你點擊編譯按鈕就可生成可執行文件,然後點擊運行即可運行。那麼,你知道從源代碼到可執行文件經歷了哪些過程嗎。僅僅是編譯?

下面以windows環境下的test.c為例,test.c裡的代碼為:

<code>#include <stdio.h>int main(void){ printf("This is a test program!\\n"); return 0;}/<stdio.h>/<code>

其經歷如下過程:

C程序的編譯過程


如圖,編譯生成可執行文件的過程實際包含四個過程:(1)預處理;(2)編譯;(3)彙編;(4)鏈接。

2、預處理(Preprpcessing)

使用預處理器把源文件test.c經過預處理生成test.i文件,預處理用於將所有的#include頭文件以及宏定義替換成其真正的內容。

預處理的命令為:

<code>gcc -E test.c -o test.i/<code>

上述命令中-E是讓編譯器在預處理之後就退出,不進行後續編譯過程;-o是指定輸出文件名。

預處理之後得到的仍然是文本文件。test.i文件部分內容截圖如下:

C程序的編譯過程


3、編譯(Compilation)

使用編譯器將預處理文件test.i編譯成彙編文件test.s。

編譯的命令為:

<code>gcc -S test.i -o test.s/<code>

上述命令中-S讓編譯器在編譯之後停止,不進行後續過程;-o是指定輸出文件名。彙編文件test.s是文本文件,部分內容截圖如下:

C程序的編譯過程


4、彙編(Assemble)

使用匯編器將彙編文件test.s轉換成目標文件test.o。

彙編過程的命令為:

<code>gcc -c test.s -o test.o/<code>

上述命令中-c、-o讓彙編器把彙編文件test.s轉換成目標文件test.o。目標文件test.o是二進制文件,部分內容截圖如下:

C程序的編譯過程


5、鏈接(Linking)

鏈接過程使用鏈接器將該目標文件與其他目標文件、庫文件、啟動文件等鏈接起來生成可執行文件。

鏈接過程的命令為:

<code>gcc test.o -o test.exe/<code>

綜上,生成可執行程序過程為:預處理、編譯、彙編、鏈接。各個命令如下圖所示:

C程序的編譯過程

以上就是本次的分享,如有錯誤,歡迎指出!



分享到:


相關文章: