gcc如何編譯C語(yǔ)言程序
gcc如何編譯C語(yǔ)言程序
gcc編譯C語(yǔ)言程序的方法是什么,那么gcc如何編譯C語(yǔ)言程序的呢/下面是學(xué)習(xí)啦小編收集整理的gcc如何編譯C語(yǔ)言程序,希望對(duì)大家有幫助~~
gcc編譯C語(yǔ)言程序的方法
編寫c代碼,并輸入以下代碼,生成文件hello.c
[root@wahoo test]# vim hello.c
#include
#define DISPLAY "hello c!"
int main(void)
{
printf("%s\n", DISPLAY );
return 0;
}
ZZ(說(shuō)明:ZZ當(dāng)前文件進(jìn)行快速保存操作)
預(yù)編譯(Preprocessing)
會(huì)對(duì)各種預(yù)處理指令(#include #define #ifdef 等#開始的代碼行)進(jìn)行處理,刪除注釋和多余的空白字符,生成一份新的代碼
[root@wahoo test]#gcc -E hello.c -o hello.i
E 參數(shù) 通知gcc對(duì)目標(biāo)文件進(jìn)行預(yù)編譯,這里是對(duì)文件hello.c文件
o 參數(shù) 是對(duì)命令輸出結(jié)果進(jìn)行導(dǎo)入操作,這里是把 gcc -E hello.c 操作結(jié)果輸出到文件hello.i(命名要自定義)中進(jìn)行保存
這個(gè)命令執(zhí)行完后我們目錄下多了一個(gè)文件hello.i,你可以查閱一下文件的內(nèi)容。
編譯(Compilation)
對(duì)代碼進(jìn)行語(yǔ)法、語(yǔ)義分析和錯(cuò)誤判斷,生成匯編代碼文件
[root@wahoo test]#gcc -S hello.i -o hello.s
S 參數(shù) 通知gcc對(duì)目標(biāo)文件進(jìn)行編譯,這里是對(duì)文件hello.i文件
通過(guò)這一步我們知道 C語(yǔ)言跟匯編的 關(guān)系,至于他們之前是如何進(jìn)行轉(zhuǎn)換的,大家可以進(jìn)行更深入的學(xué)習(xí)與探討。
此時(shí)目錄下多了一個(gè)hello.s文件,內(nèi)容如圖
匯編(Assembly)
把匯編代碼轉(zhuǎn)換與計(jì)算機(jī)可認(rèn)識(shí)的二進(jìn)制文件,要知道計(jì)算機(jī)只認(rèn)識(shí)0和1呢
[root@wahoo test]#gcc -c hello.s -o hello.o
c 參數(shù) 通知gcc對(duì)目標(biāo)文件執(zhí)行指令轉(zhuǎn)換操作
此步驟我們得到文件hello.o
大家也同樣打開文件查看一下,這個(gè)文件里面幾乎沒(méi)幾個(gè)字符大家能看懂,這就對(duì)了,但大家可以通過(guò)這種方法將其轉(zhuǎn)化為我們可讀的形式:
[root@wahoo test]#readelf -a hello.o
鏈接(Linking/Build)
通俗的講就是把多個(gè)*.o文件合并成一個(gè)可執(zhí)行文件,二進(jìn)制指令文件
[root@wahoo test]#gcc hello.o -o hello
這里我們就得到了一個(gè)可以直接在系統(tǒng)下執(zhí)行的文件 hello
我們也可以對(duì)這個(gè)文件進(jìn)行readelf操作,也可以進(jìn)行二進(jìn)制指令轉(zhuǎn)匯編的操作
[root@wahoo test]#objdump -d hello
程序運(yùn)行
[root@wahoo test]#./hello
hello c!
總結(jié):gcc 編譯c程序的主要過(guò)程包括 預(yù)編譯->編譯->匯編->連接 四個(gè)過(guò)程,每個(gè)過(guò)程都分別進(jìn)行不同的處理,了解了這其中的一些原理,對(duì)c編程的理解大有益處
gcc如何編譯C語(yǔ)言程序相關(guān)文章:
1.Linux下C語(yǔ)言編程基礎(chǔ)知識(shí)