一、預編譯
1.將所有的#define刪除,並展開所有的宏定義;
2.處理所有的預編譯指令,例如:#if,#elif,#else,#endif;
3.處理#include預編譯指令,將被包含的文件插入到預編譯指令的位置;
4.添加行號信息文件名信息,便於調試;
5.刪除所有的注釋:// /**/;
6.保留所有的#pragma編譯指令,因為在編寫程序的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
7.生成.i文件。
包括(1)去注釋 (2)宏替換 (3)頭文件展開 (4)條件編譯
二、編譯:C語言—>匯編##
1.掃描,語法分析,語義分析,源代碼優化,目標代碼生成,目標代碼優化;
2.生成匯編代碼;
3.匯總符號;
4.生成.s文件
三、匯編:匯編—>二進制
1.根據匯編指令和特定平台,把匯編指令翻譯成二進制形式;
2.合並各個section,合並符號表;
3.生成.o文件
四、鏈接##
1.合並各個.obj文件的section,合並符號表,進行符號解析;
2.符號地址重定位;
3.生成可執行文件
程序示例##
main.cpp
#include <stdio.h>
int main()
{
printf( "hello world" );
return 0;
}
1.預處理###
gcc main.c -E -o main.i
表示讓gcc只進行“預處理”就行了。 所謂的預處理,就是把程序中的宏展開, 把頭文件的內容展開包含進來等等一些編譯前的預處理操作,然后-o保存在test.i里。
2.編譯###
gcc -S main.i -o main.s
表示讓gcc只進行“預處理編譯”就行了。將test.i翻譯成文本文件test.s,它包含一個匯編語言程序。編譯會從詞法、語法和語義上對文件進行分析, 並進行匯編代碼生成, 形成的還是文本文件------匯編語言文件。以.s作為文件擴展名,然后-o保存在test.s里。
3.匯編###
gcc -c main.s -o main.o
表示讓gcc只進行“預處理編譯匯編”就行了。匯編器將test.s翻譯成二進制機器語言指令,所以我們就看不懂了,把這些指令打包成一種叫做可重定位目標程序格式,並保存在.o文件中。
4.鏈接###
gcc main.o -o a
表示讓gcc只進行“預處理編譯匯編鏈接”。最后將二進制機器語言指令轉換成二進制的可執行程序。
5.運行###
./a