《Linux C從入門到精通》.明日科技.第05章.GCC 編譯器_第1頁(yè)
《Linux C從入門到精通》.明日科技.第05章.GCC 編譯器_第2頁(yè)
《Linux C從入門到精通》.明日科技.第05章.GCC 編譯器_第3頁(yè)
《Linux C從入門到精通》.明日科技.第05章.GCC 編譯器_第4頁(yè)
《Linux C從入門到精通》.明日科技.第05章.GCC 編譯器_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

初識(shí)gcc編譯器本講大綱:第一次編譯gcc選項(xiàng)概述警告gcc調(diào)試代碼優(yōu)化第一次編譯在為L(zhǎng)inux開發(fā)應(yīng)用程序時(shí),絕大多數(shù)情況下使用的都是C語(yǔ)言,因此幾乎每一位Linux程序員面臨的首要問(wèn)題都是如何靈活運(yùn)用C編譯器。目前Linux下最常用的C語(yǔ)言編譯器是GCC(GNUCompilerCollection),它是GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語(yǔ)言編寫的程序。GCC不僅功能非常強(qiáng)大,結(jié)構(gòu)也異常靈活。最值得稱道的一點(diǎn)就是它可以通過(guò)不同的前端模塊來(lái)支持各種語(yǔ)言,如Java、Fortran、Pascal、Modula-3和Ada等。Linux系統(tǒng)下的Gcc(GNUCCompiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%。5.1.1第一次編譯在學(xué)習(xí)使用GCC之前,下面的這個(gè)例子能夠幫助用戶迅速理解GCC的工作原理,并將其立即運(yùn)用到實(shí)際的項(xiàng)目開發(fā)中去。首先用熟悉的編輯器輸入如下所示的代碼:#include<stdio.h>intmain(){

printf("hello

word!Linux

c!\n");return0;}將上面的代碼保存為hello.c,然后用戶就可以在終端中對(duì)上面的C語(yǔ)言代碼進(jìn)行編譯了。并且我們給編譯出的新文件其名為hello,最后執(zhí)行編譯好的文件。上面在編譯的時(shí)候,為gcc的后面加入了選項(xiàng)-o進(jìn)行新文件的重命名,如果不加入這個(gè)選項(xiàng),那么新文件就會(huì)默認(rèn)為a.out,如果再次編譯其他的文件,同樣不進(jìn)行重命名的話,那么這里的a.out將會(huì)被覆蓋掉。gcc選項(xiàng)概述在使用Gcc編譯器的時(shí)候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。Gcc編譯器的調(diào)用參數(shù)大約有100多個(gè),其中多數(shù)參數(shù)我們可能根本就用不到,這里只介紹其中最基本、最常用的參數(shù)。Gcc最基本的用法是∶gcc[options][filenames]其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱。-c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。-ooutput_filename,確定輸出文件的名稱為output_filename,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。-g,產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。-O,對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。-O2,比-O更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。警告GCC包含完整的出錯(cuò)檢查和警告提示功能,它們可以幫助Linux程序員寫出更加專業(yè)和優(yōu)美的代碼。先來(lái)看看下面所示的程序,這段代碼寫得很有問(wèn)題,仔細(xì)檢查一下不難挑出很多毛病:#include<stdio.h>voidmain(void){longlong

int

var=1;printf("ItisnotstandardCcode!\n");}main函數(shù)的返回值被聲明為void,但實(shí)際上應(yīng)該是int;使用了GNU語(yǔ)法擴(kuò)展,即使用longlong來(lái)聲明64位整數(shù),不符合ANSI/ISOC語(yǔ)言標(biāo)準(zhǔn);main函數(shù)在終止前沒(méi)有調(diào)用return語(yǔ)句。下面來(lái)看看GCC是如何來(lái)發(fā)現(xiàn)這些錯(cuò)誤的。當(dāng)GCC在編譯不符合ANSI/ISOC語(yǔ)言標(biāo)準(zhǔn)的源代碼時(shí),如果加上了-pedantic選項(xiàng),那么使用了擴(kuò)展語(yǔ)法的地方將產(chǎn)生相應(yīng)的警告信息:#gcc-pedanticillcode.c-oillcode

illcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport`longlong'illcode.c:8:returntypeof`main'isnot`int'值得注意的是,-pedantic編譯選項(xiàng)并不能保證被編譯程序與ANSI/ISOC標(biāo)準(zhǔn)的完全兼容,它僅僅只能用來(lái)幫助Linux程序員離這個(gè)目標(biāo)越來(lái)越近?;蛘邠Q句話說(shuō),-pedantic選項(xiàng)能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISOC標(biāo)準(zhǔn)的代碼,但不是全部,事實(shí)上只有ANSI/ISOC語(yǔ)言標(biāo)準(zhǔn)中要求進(jìn)行編譯器診斷的那些情況,才有可能被GCC發(fā)現(xiàn)并提出警告。除了-pedantic之外,GCC還有一些其它編譯選項(xiàng)也能夠產(chǎn)生有用的警告信息。這些選項(xiàng)大多以-W開頭,其中最有價(jià)值的當(dāng)數(shù)-Wall了,使用它能夠使GCC產(chǎn)生盡可能多的警告信息:#gcc-Wallillcode.c-oillcodeillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable`var'GCC給出的警告信息雖然從嚴(yán)格意義上說(shuō)不能算作是錯(cuò)誤,但卻很可能成為錯(cuò)誤的棲身之所。但是作為一個(gè)優(yōu)秀的Linux程序員應(yīng)該盡量避免產(chǎn)生警告信息,使自己的代碼始終保持簡(jiǎn)潔、優(yōu)美和健壯的特性。在處理警告方面,另一個(gè)常用的編譯選項(xiàng)是-Werror,它要求GCC將所有的警告當(dāng)成錯(cuò)誤進(jìn)行處理,這在使用自動(dòng)編譯工具(如Make等)時(shí)非常有用。如果編譯時(shí)帶上-Werror選項(xiàng),那么GCC會(huì)在所有產(chǎn)生警告的地方停止編譯,迫使程序員對(duì)自己的代碼進(jìn)行修改。只有當(dāng)相應(yīng)的警告信息消除時(shí),才可能將編譯過(guò)程繼續(xù)朝前推進(jìn)。執(zhí)行情況如下:#gcc-Wall-Werror

illcode.c-oillcodecc1:warningsbeingtreatedaserrorsillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable`var'對(duì)Linux程序員來(lái)講,GCC給出的警告信息是很有價(jià)值的,它們不僅可以幫助程序員寫出更加健壯的程序,而且還是跟蹤和調(diào)試程序的有力工具。建議在用GCC編譯源代碼時(shí)始終帶上-Wall選項(xiàng),并把它逐漸培養(yǎng)成為一種習(xí)慣,這對(duì)找出常見(jiàn)的隱式編程錯(cuò)誤很有幫助。

gcc調(diào)試代碼優(yōu)化標(biāo)題gcc編譯的基本流程本講大綱:C預(yù)處理編譯匯編連接C預(yù)處理C預(yù)處理器CPP是用來(lái)完成對(duì)于程序中的宏定義等相關(guān)內(nèi)容進(jìn)行先期的處理。一般是指那些前面含有“#”號(hào)的語(yǔ)句,這些語(yǔ)句一般會(huì)在CPP中處理。例如:#defineMR(25*4)Printf(“%d”,MR*5);經(jīng)過(guò)CPP的處理后,就會(huì)變成如下格式傳遞到代碼中:printf(“%d”,(25*4)*5)其實(shí)不難看出,CPP的作用就是解釋后定義和處理包含文件。在gcc中使用時(shí),gcc會(huì)自動(dòng)調(diào)用CPP預(yù)處理器。編譯編譯的過(guò)程就是將輸入的源代碼和預(yù)處理相關(guān)文件編譯為“.o”的目標(biāo)文件。匯編在使用gcc編譯程序的時(shí)候,會(huì)產(chǎn)生一些匯編代碼,而處理這些匯編代碼就需要使用匯編器as,as可以處理這些匯編代碼,從而使其成為目標(biāo)文件,最終目標(biāo)文件轉(zhuǎn)換成.o文件或其他可執(zhí)行文件。而且as匯編器和CPP一樣,可以被gcc自動(dòng)調(diào)用。連接在處理一個(gè)較大的C語(yǔ)言項(xiàng)目時(shí),我們通常會(huì)將程序分割成很多模塊,那么這時(shí)候就需要使用連接器將這些模塊組合起來(lái),并且結(jié)合相應(yīng)的C語(yǔ)言函數(shù)庫(kù)和初始代碼,產(chǎn)生最后的可執(zhí)行文件。連接器一般在一些大的程序和項(xiàng)目中,對(duì)最后生成可執(zhí)行文件起著重要的作用。雖然gcc可以自動(dòng)調(diào)用連接器,但是為了更好的控制連接過(guò)程,建議最好手動(dòng)調(diào)用連接器。

其他編譯工具簡(jiǎn)介本講大綱:C++編譯器g++EGCSf2c和p2cC++編譯器g++

Gcc編譯器雖然可以對(duì)c++的源代碼進(jìn)行編譯,但是需要手動(dòng)的設(shè)置一些選項(xiàng),在使用時(shí)很不方便,而且容易產(chǎn)生一些錯(cuò)誤。而g++編譯器使用的選項(xiàng)和gcc一樣,但是在使用擴(kuò)展名的時(shí)候,一般使用.cxx,這樣就可以很好的與c代碼進(jìn)行區(qū)別。G++命令格式如下:g++[-options][filename

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論