使用GCC編譯器編譯C語言
GCC編譯C原始碼有四個步驟:預先處理—->編譯—->彙編—->連結。
可以利用GCC的參數來控制執行的過程,這樣就可以更深入的瞭解編譯C程式的過程。
下面將通過對一個程式的編譯來示範整個過程。
#include <stdio.h>
int main()
{
printf("happy new year!\n");
return 0;
}
1:預先處理:編譯器將C程式的標頭檔編譯進來,還有宏的替換,可以用gcc的參數-E來參看。
預先處理 命令:gcc -E hello.c -o hello.i
作用:將hello.c預先處理輸出hello.i
2:編譯:這個階段編譯器主要做詞法分析、文法分析、語義分析等,在檢查無錯誤後後,把代碼翻譯成組合語言。可用gcc的參數-S來參看。
編譯器(ccl)將文字檔hello.i 翻譯成文字檔hello.s, 它包含一個組合語言程式。組合語言程式中的每條語句都以一種標準的文字格式設定描述了一條低級機器語言指令。
編譯命令:gcc -S hello.i -o hello.s
作用:將預先處理輸出檔案hello.i彙編成hello.s檔案
3:彙編:把編譯階段產生的.s 檔案轉換為二進位目標代碼。可用gcc的參數-c來參看。彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程式的格式, 並將結果儲存在目標檔案hello.o中。hello.o檔案是一個二進位檔案,它的位元組編碼是機器語言。
彙編 命令:gcc -c hello.s -o hello.o
作用:作用:將彙編輸出檔案hello.s編譯輸出hello.o檔案
4:連結:把obj檔案連結為可執行檔檔案:連結器(ld)負責.o檔案的併入。結果就是hello檔案,它是一個課執行的目標檔案,可以載入到儲存空間後由系統調用。
連結命令:gcc hello.o -o hello
一步操作的話是: (-o必須在hello之前 )
$gcc hello.c -o hello
$./hello或者:(會預設產生a.out檔案)
$gcc hello.c
$./a.out