gcc test.c -o test
,這一行命令就可以將test.c源代碼生成可執(zhí)行文件test慨代,下面是拆解這個(gè)過程邢笙。總結(jié)這個(gè)變化過程為test.c 》 test.i 》 test.s 》 test.o 》 test
一侍匙、預(yù)編譯(預(yù)處理)
1.將所有的#define刪除氮惯,并展開所有的宏定義;
2.處理所有的預(yù)編譯指令想暗,例如:#if,#elif,#else,#endif;
3.處理#include預(yù)編譯指令妇汗,將被包含的文件插入到預(yù)編譯指令的位置;
4.添加行號(hào)信息文件名信息说莫,便于調(diào)試杨箭;
5.刪除所有的注釋:// /**/;
6.保留所有的#pragma編譯指令,因?yàn)樵诰帉懗绦虻臅r(shí)候,我們經(jīng)常要用到#pragma指令來設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作储狭。
包括(1)去注釋 (2)宏替換 (3)頭文件展開 (4)條件編譯
gcc test.c -E -o test.i
生成.i文件互婿。
二、編譯:C語言——》匯編
1.掃描辽狈,語法分析慈参,語義分析,源代碼優(yōu)化刮萌,目標(biāo)代碼生成驮配,目標(biāo)代碼優(yōu)化;
2.生成匯編代碼着茸;
3.匯總符號(hào)僧凤;
4.生成.s文件
gcc test.i -S -o test.s
生成.s文件
三、匯編:匯編——》二進(jìn)制
1.根據(jù)匯編指令和特定平臺(tái)元扔,把匯編指令翻譯成二進(jìn)制形式躯保;
2.合并各個(gè)section,合并符號(hào)表;
3.生成.o文件
gcc test.s -c -o test.o
生成.o文件
四澎语、鏈接
1.合并各個(gè).obj文件的section途事,合并符號(hào)表,進(jìn)行符號(hào)解析擅羞;
2.符號(hào)地址重定位尸变;
3.生成可執(zhí)行文件
gcc test.o -o test
生成可執(zhí)行文件test,當(dāng)前文件夾下執(zhí)行./test减俏,即可運(yùn)行程序召烂。
gcc test1.o test2.o -o test
,即將兩個(gè).o文件鏈接在一起娃承,生成可執(zhí)行文件test奏夫。
直接一條命令搞定就是gcc test1.c test2.c -o test
以上內(nèi)容參考自:https://blog.csdn.net/quinn0918/article/details/70024401
注意:
我們用gcc編譯程序時(shí)怕篷,常常會(huì)用到“-I”(大寫i)后接頭文件地址,“-L”(大寫l)后接鏈接庫文件地址酗昼,“-l”(小寫l)指定需鏈接的庫文件等參數(shù)廊谓,下面做個(gè)記錄:例:
gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
這條命令運(yùn)行后,會(huì)在當(dāng)前文件夾下產(chǎn)生一個(gè)hello文件麻削,這個(gè)文件就是可執(zhí)行文件(類似windows的hello.exe)蒸痹,在當(dāng)前文件執(zhí)行命令./hello,即可運(yùn)行該文件呛哟,也就是運(yùn)行后面三個(gè)C源文件叠荠。-o即out指定輸出文件名。