1. 源代碼(hello.c)
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
2. 預編譯過程
$ gcc -E hello.c -o hello.i
預編譯過程包含如下幾個關鍵步驟
-
#define定義的宏全部刪除,并且展開所有的宏定義 - 處理所有條件編譯指令
#if 、#ifdef、#elif、#else、#endif - 處理
#inlcude預編譯指令,將被包含的文件插入到該預編譯的位置,這個過程可能是遞歸的 - 刪除所有的
//和/* */ - 添加行號和文件名標識,以便編譯器編譯或者調試的時候能輸出行號信息
- 保留所有編譯器相關的指令
我們可以通過hello.i文件,判斷代碼里定義的宏是否正確被展開
3. 編譯過程
$ gcc -S hello.c -o hello.s
hello.s 是匯編代碼
4. 匯編過程
$ gcc -c hello.s -o hello.o
hello.o 是目標文件,ELF格式
5. 鏈接過程
ld命令可以完成鏈接過程
$gcc hello.c -o hello包含了以上編譯和鏈接的過程,直接生成了可執(zhí)行文件。