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

下載本文檔

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

文檔簡介

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

printf("hello

word!Linux

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

int

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

illcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport`longlong'illcode.c:8:returntypeof`main'isnot`int'值得注意的是,-pedantic編譯選項并不能保證被編譯程序與ANSI/ISOC標準的完全兼容,它僅僅只能用來幫助Linux程序員離這個目標越來越近?;蛘邠Q句話說,-pedantic選項能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISOC標準的代碼,但不是全部,事實上只有ANSI/ISOC語言標準中要求進行編譯器診斷的那些情況,才有可能被GCC發(fā)現(xiàn)并提出警告。除了-pedantic之外,GCC還有一些其它編譯選項也能夠產(chǎn)生有用的警告信息。這些選項大多以-W開頭,其中最有價值的當數(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ōu)秀的Linux程序員應該盡量避免產(chǎn)生警告信息,使自己的代碼始終保持簡潔、優(yōu)美和健壯的特性。在處理警告方面,另一個常用的編譯選項是-Werror,它要求GCC將所有的警告當成錯誤進行處理,這在使用自動編譯工具(如Make等)時非常有用。如果編譯時帶上-Werror選項,那么GCC會在所有產(chǎn)生警告的地方停止編譯,迫使程序員對自己的代碼進行修改。只有當相應的警告信息消除時,才可能將編譯過程繼續(xù)朝前推進。執(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'對Linux程序員來講,GCC給出的警告信息是很有價值的,它們不僅可以幫助程序員寫出更加健壯的程序,而且還是跟蹤和調(diào)試程序的有力工具。建議在用GCC編譯源代碼時始終帶上-Wall選項,并把它逐漸培養(yǎng)成為一種習慣,這對找出常見的隱式編程錯誤很有幫助。

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

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

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

溫馨提示

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

評論

0/150

提交評論