資源描述:
《GCC的編譯流程詳解》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、GCC的編譯流程詳解???在進(jìn)行openvpn移植時(shí),因?yàn)樾枰猯zo庫(kù)和openssl庫(kù)的支持,而我又不想生成共享庫(kù),所以采取了靜態(tài)編譯的方式。但是在編譯鏈接時(shí)錯(cuò)把-static理解是編譯的參數(shù)了,實(shí)際上是對(duì)于編譯和鏈接的概念還有點(diǎn)模糊。網(wǎng)友孤云為我舉了一個(gè)例子,如下:????(1)A=gcc?B=-o-static???(2)A=gcc-static?B=-o????A+B,對(duì)于結(jié)果,這兩個(gè)是沒(méi)有什么區(qū)別的,但是,A和B完全就不同了。為了深入理解C語(yǔ)言編譯鏈接的整個(gè)流程,我結(jié)合華清遠(yuǎn)見(jiàn)的Linux下的C語(yǔ)言編程基礎(chǔ),實(shí)踐
2、之后認(rèn)識(shí)就深刻多了。????一、首先,先對(duì)Linux下C語(yǔ)言開(kāi)發(fā)的流程有個(gè)大體的了解。簡(jiǎn)單的說(shuō),就是:???1、編寫(xiě)C程序源代碼*.c???2、預(yù)處理(Pre-Processing)???3、編譯(Compiling)???4、匯編(Assembling)-->生成目標(biāo)代碼*.o???5、鏈接(Linking)-->生成可執(zhí)行文件???6、調(diào)試????其中,第一步工作用編輯器來(lái)實(shí)現(xiàn),用Emacs、Vi(m)都可以。我現(xiàn)在習(xí)慣用Vim。在RedHat9.0中,Vim版本為6.1,系統(tǒng)采用alias用vi作為vim的別名,因此在shell提示符下輸入vi實(shí)際上使用的編輯器vim(ViIMpro
3、ved)。你可以使用which查看一下:?[armlinux@lqmprogram]$whichvialiasvi='vim'???????/usr/bin/vim????除去第6步的工作由GDB之類(lèi)的調(diào)試器來(lái)完成,中間的四步工作都是由GCC來(lái)完成的。????二、下面大體了解一下GCC。---------------------------------------標(biāo)準(zhǔn)·ANSIC:這一標(biāo)準(zhǔn)是ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)局)于1989年制定的C語(yǔ)言標(biāo)準(zhǔn)。后來(lái)被ISO(國(guó)際標(biāo)準(zhǔn)化組織)接受為標(biāo)準(zhǔn),因此也稱(chēng)為ISOC。ANSIC的目標(biāo)是為各種操作系統(tǒng)上的C程序提供可移植性保證,而不僅僅限于UNIX。該
4、標(biāo)準(zhǔn)不僅定義了C編程語(yǔ)言的語(yǔ)發(fā)和語(yǔ)義,而且還定義了一個(gè)標(biāo)準(zhǔn)庫(kù)。這個(gè)庫(kù)可以根據(jù)頭文件劃分為15個(gè)部分,其中包括:字符類(lèi)型()、錯(cuò)誤碼()、浮點(diǎn)常數(shù)()、數(shù)學(xué)常數(shù)()、標(biāo)準(zhǔn)定義()、標(biāo)準(zhǔn)I/O()、工具函數(shù)()、字符串操作()、時(shí)間和日期()、可變參數(shù)表()、信號(hào)()、非局部跳轉(zhuǎn)()、本地信息()、程序斷言()等等?!OSIX:該標(biāo)準(zhǔn)
5、最初由IEEE開(kāi)發(fā)的標(biāo)準(zhǔn)族,部分已經(jīng)被ISO接受為國(guó)際標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)的具體內(nèi)容見(jiàn)1.1.3。POSIX.1和POSIX.2分別定義了POSIX兼容操作系統(tǒng)的C語(yǔ)言系統(tǒng)接口以及shell和工具標(biāo)準(zhǔn)。這兩個(gè)標(biāo)準(zhǔn)是通常提到的標(biāo)準(zhǔn)?!VID:SystemV的接口描述。SystemV接口描述(SVID)是描述AT&&;TUnixSystemV操作系統(tǒng)的文檔,是對(duì)POSIX標(biāo)準(zhǔn)的擴(kuò)展超集。·XPG:X/Open可移植性指南。X/Open可移植性指南(由X/OpenCompany,Ltd.出版),是比POSIX更為一般的標(biāo)準(zhǔn)。X/Open擁有Unix的版權(quán),而XPG則指定成為Unix操作系統(tǒng)必須滿(mǎn)足的要
6、求。---------------------------------------???GCC是GNUCC的簡(jiǎn)稱(chēng),它是符合上述ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯C、C++、ObjectC等語(yǔ)言編寫(xiě)的程序。GCC還是一個(gè)交叉平臺(tái)編譯器,能夠在當(dāng)前CPU平臺(tái)為多種不同架構(gòu)的硬件平臺(tái)開(kāi)發(fā)軟件,因此適合嵌入式領(lǐng)域的開(kāi)發(fā)編譯。?GCC所支持的后綴名的解釋.cC原始程序.C/.cc/.cxx?C++原始程序.m?ObjectC原始程序.i?已經(jīng)過(guò)預(yù)處理的C原始程序.ii?已經(jīng)過(guò)預(yù)處理的C++原始程序.s/.S?匯編語(yǔ)言原始程序.h?預(yù)處理文件(頭文件).o?目標(biāo)文件.a/.so?編譯后的庫(kù)文件????
7、三、詳解GCC編譯流程???使用vi編寫(xiě)源文件hello.c。??#includeintmain(){???????inti;???????for(i=1;i<9;i++)???????????????printf("HelloWorld%dtimes!",i);???????return0;}????1、預(yù)處理階段????該階段的作用是把預(yù)處理文件,也就是頭文件編譯進(jìn)來(lái)。在此例中,就是要把stdi