九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

2-4Linux編程基礎(chǔ)

上傳人:fgh****35 文檔編號(hào):247445016 上傳時(shí)間:2024-10-18 格式:PPT 頁(yè)數(shù):57 大?。?96.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
2-4Linux編程基礎(chǔ)_第1頁(yè)
第1頁(yè) / 共57頁(yè)
2-4Linux編程基礎(chǔ)_第2頁(yè)
第2頁(yè) / 共57頁(yè)
2-4Linux編程基礎(chǔ)_第3頁(yè)
第3頁(yè) / 共57頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《2-4Linux編程基礎(chǔ)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《2-4Linux編程基礎(chǔ)(57頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),www.chinaEDA.cn,linux,編程基礎(chǔ),Linux,程序設(shè)計(jì)基礎(chǔ),本章學(xué)習(xí)目標(biāo),通過(guò)對(duì)本章的學(xué)習(xí),讀者應(yīng)該掌握以下主要內(nèi)容:,Linux,編程風(fēng)格,Linux,下使用,GNU cc,開(kāi)發(fā)應(yīng)用程序,Linux,程序的調(diào)試,1.,概述,1.1 Linux,編程,Linux,軟件開(kāi)發(fā)一直在,Internet,環(huán)境下講行。這個(gè)環(huán)境是全球性的,編程人員來(lái)自世界各地。只要能夠訪(fǎng)問(wèn),Web,站點(diǎn),就可以啟動(dòng)一個(gè)以,Linux,為基礎(chǔ)的軟件項(xiàng)目。,Linux,開(kāi)發(fā)工作經(jīng)常是在,Linux,用戶(hù)決定共同完成一個(gè)項(xiàng)目

2、時(shí)開(kāi)始的。當(dāng)開(kāi)發(fā)工作完成后,該軟件就被放到,Internet,站點(diǎn)上,任何用戶(hù)都可以訪(fǎng)問(wèn)和下載它。由于這個(gè)活躍的開(kāi)發(fā)環(huán)境,新的以,Linux,為基礎(chǔ)的軟件功能日益強(qiáng)大,而且呈現(xiàn)爆炸式的增長(zhǎng)態(tài)勢(shì)。,大多數(shù),Linux,軟件是經(jīng)過(guò)自由軟件基金會(huì)(,Free Software Foundation,)提供的,GNU,(,GNU,即,GNUs,not UNIX,)公開(kāi)認(rèn)證授權(quán)的,因而通常被稱(chēng)作,GNU,軟件。,GNU,軟件免費(fèi)提供給用戶(hù)使用,并被證明是非??煽亢透咝У?。許多流行的,Linux,實(shí)用程序如,C,編譯器、,shell,和編輯器都是,GNU,軟件應(yīng)用程序。,Linux,程序需要首先轉(zhuǎn)化為低級(jí)

3、機(jī)器語(yǔ)言即所謂的二進(jìn)制代碼以后,才能被操作系統(tǒng)執(zhí)行。例如編程時(shí),先用普通的編程語(yǔ)言生成一系列指令,這些指令可被翻譯為適當(dāng)?shù)目蓤?zhí)行應(yīng)用程序的二進(jìn)制代碼。這個(gè)翻譯過(guò)程可由解釋器一步步來(lái)完成,或者也可以立即由編譯器明確地完成。,shell,編程語(yǔ)言如,BASH,、,TCSH,、,GAWK,、,Perl,、,Tcl,和,Tk,都利用自己的解釋器。用這些語(yǔ)言編制的程序盡管是應(yīng)用程序文件,但可以直接運(yùn)行。編譯器則不同,它將生成一個(gè)獨(dú)立的二進(jìn)制代碼文件然后才可以運(yùn)行。,1,GNU,風(fēng)格,(,1,)函數(shù)返回類(lèi)型說(shuō)明和函數(shù)名分兩行放置,函數(shù)起始字符和函數(shù)開(kāi)頭左花括號(hào)放到最左邊。,(,2,)盡量不要讓兩個(gè)不同優(yōu)先

4、級(jí)的操作符出現(xiàn)在相同的對(duì)齊方式中,應(yīng)該附加額外的括號(hào)使得代碼縮進(jìn)可以表示出嵌套。,(,3,)按照規(guī)定方式排版,do-while,語(yǔ)句:,(,4,)每個(gè)程序都應(yīng)該以一段簡(jiǎn)短的說(shuō)明其功能的注釋開(kāi)頭。,(,5,)請(qǐng)為每個(gè)函數(shù)書(shū)寫(xiě)注釋?zhuān)f(shuō)明函數(shù)是做什么的,需要哪些入口參數(shù),參數(shù)可能值的含義和用途。如果用了非常見(jiàn)的、非標(biāo)準(zhǔn)的東西,或者可能導(dǎo)致函數(shù)不能工作的任何可能的值,應(yīng)該進(jìn)行特殊說(shuō)明。如果存在重要的返回值,也需要說(shuō)明。,(,6,)不要聲明多個(gè)變量時(shí)跨行,每一行都以一個(gè)新的聲明開(kāi)頭。,(,7,)當(dāng)一個(gè),if,中嵌套了另一個(gè),if-else,時(shí),應(yīng)用花括號(hào)把,if-else,括起來(lái)。,(,8,)要在同一個(gè)

5、聲明中同時(shí)說(shuō)明結(jié)構(gòu)標(biāo)識(shí)和變量或者結(jié)構(gòu)標(biāo)識(shí)和類(lèi)型定義,(,typedef,),。先定義變量,再使用。,(,9,)盡量避免在,if,的條件中進(jìn)行賦值。,(,10,)請(qǐng)?jiān)诿种惺褂孟聞澗€(xiàn)以分割單詞,盡量使用小寫(xiě);把大寫(xiě)字母留給宏和枚舉常量,以及根據(jù)統(tǒng)一慣例使用的前綴。例如,應(yīng)該使用類(lèi)似,ignore_space_change_flag,的名字;不要使用類(lèi)似,iCantReadThis,的名字。,2,Linux,內(nèi)核編程風(fēng)格,(,1,),Linux,內(nèi)核縮進(jìn)風(fēng)格是,8,個(gè)字符。,(,2,),Linux,內(nèi)核風(fēng)格采用,K&R,標(biāo)準(zhǔn),將開(kāi)始的大括號(hào)放在一行的最后,而將結(jié)束的大括號(hào)放在一行的第一位。,(,3

6、,)命名盡量簡(jiǎn)潔。不應(yīng)該使用諸如,ThisVariableIsATemporaryCounter,之類(lèi)的名字。應(yīng)該命名為,tmp,,這樣容易書(shū)寫(xiě),也不難理解。但是命名全局變量,就應(yīng)該用描述性命名方式,例如應(yīng)該命名“,count_active_users,()”,,而不是“,cntusr,()”,。本地變量應(yīng)該避免過(guò)長(zhǎng)。,2. Vi,的使用,vi,提供了一些功能強(qiáng)大的但容易記憶的命令供用戶(hù)使用。類(lèi)似這樣的編輯任務(wù)在,vi,中可以輕松高效完成。,編輯命令,命 令,功 能,Nx,(Expurgate),刪除從光標(biāo)位置開(kāi)始的連續(xù),N,個(gè)字符(并復(fù)制到編輯緩沖區(qū)),Ndd,(Delete),刪除從光標(biāo)位

7、置開(kāi)始的連續(xù),N,行(并復(fù)制到編輯緩沖區(qū)),Nyy,(Yank),復(fù)制從光標(biāo)位置開(kāi)始的連續(xù),N,行到編輯緩沖區(qū),p,(Put),從編輯緩沖區(qū)復(fù)制文本到當(dāng)前光標(biāo)位置(即粘貼),u,(Undo),取消上一次操作(即恢復(fù)功能),光標(biāo)命令,命 令,功 能,h,方向鍵,向左移動(dòng)光標(biāo)一個(gè)字符的位置,相當(dāng)于鍵“”,j,方向鍵,向下移動(dòng)光標(biāo)到下一行的位置,相當(dāng)于鍵“”,k,方向鍵,向上移動(dòng)光標(biāo)到上一行的位置,相當(dāng)于鍵“”,l,方向鍵,向右移動(dòng)光標(biāo)一個(gè)字符的位置,相當(dāng)于鍵“”,:N,移動(dòng)光標(biāo)到第,N,行(,N,待定),1G,移動(dòng)光標(biāo)到文件的第,1,行,G,移動(dòng)光標(biāo)到文件的最后,1,行,:set number,設(shè)

8、置顯示行號(hào),:set,nonumber,取消顯示行號(hào),文件命令,命 令,功 能,:q,(Quit),退出沒(méi)有被修改的文件,(若文件被修改了而沒(méi)有保存,則此命令無(wú)效),:q!,強(qiáng)制退出,且不保存修改過(guò)的部分,:w,(Write),保存文件,但不退出,:w!,強(qiáng)制保存文件,但不退出,:x,(Exit),保存文件并退出,:x!,強(qiáng)制保存文件并退出,:w File,另存為,File,給出的文件名,不退出,:w! File,強(qiáng)制另存為,File,給出的文件名,不退出,:r File,(Read),讀入,File,指定的文件內(nèi)容插入到光標(biāo)位置,狀態(tài)命令,命 令,功 能,a,(Append),進(jìn)入編輯狀態(tài),

9、從當(dāng)前光標(biāo)之后的位置開(kāi)始插入鍵盤(pán)輸入的字符,i,(Insert),進(jìn)入編輯狀態(tài),從當(dāng)前光標(biāo)之后的位置開(kāi)始插入鍵盤(pán)輸入的字符,o,(Open),進(jìn)入編輯狀態(tài),并插入一新行,光標(biāo)移到該新行的行首,以后鍵盤(pán)輸入的字符將插入到光標(biāo)位置,ESC,進(jìn)入命令狀態(tài),:! Command,在,vi,中執(zhí)行外部命令,Command,,,按回車(chē)鍵可以返回,vi,繼續(xù)工作,3.,使用,GNU cc,開(kāi)發(fā)應(yīng)用程序,3.1,使用,GNU cc,gcc,可以使程序員靈活地控制編譯過(guò)程。編譯過(guò)程一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不同的工具進(jìn)行處理,如圖,9-18,所示。,預(yù)處理,鏈接,編譯,匯編,源程序,(*.c),

10、可執(zhí)行文件,預(yù)處理器,編譯器,匯編器,連接器,3.2,gcc,的版本信息,一般來(lái)說(shuō),系統(tǒng)安裝后就已經(jīng)安裝和設(shè)定好了,gcc,。在,shell,的提示符下鍵入,gcc,v,,屏幕上就會(huì)顯示出目前正在使用的,gcc,的版本,同時(shí)這可以確定系統(tǒng)所支持的是,ELF,還是,a.out,可執(zhí)行文件格式。,Linux,系統(tǒng)中可執(zhí)行文件有兩種格式。第一種格式是,a.out,格式,這種格式用于早期的,Linux,系統(tǒng)以及,Unix,系統(tǒng)的原始格式。,a.out,來(lái)自于,Unix C,編譯程序默認(rèn)的可執(zhí)行文件名。當(dāng)使用共享庫(kù)時(shí),,a.out,格式就會(huì)發(fā)生問(wèn)題。把,a.out,格式調(diào)整為共享庫(kù)是一種非常復(fù)雜的操作,

11、由于這個(gè)原因,一種新的文件格式被引入,Unix,系統(tǒng),5,的第四版本和,Solaris,系統(tǒng)中。它被稱(chēng)為可執(zhí)行和連接的格式(,ELF,)。這種格式很容易實(shí)現(xiàn)共享庫(kù)。,ELF,格式已經(jīng)被,Linux,系統(tǒng)作為標(biāo)準(zhǔn)的格式采用。,gcc,編譯程序產(chǎn)生的所有的二進(jìn)制文件都是,ELF,格式的文件(即使可執(zhí)行文件的默認(rèn)名仍然是,a.out,)。較舊的,a.out,格式的程序仍然可以運(yùn)行在支持,ELF,格式的系統(tǒng)上。,3.3 gcc,的使用,gcc,的使用格式如下:,$,gcc,optionsfilenames,其中,filenames,為所要編譯的程序源文件。,當(dāng)使用,gcc,時(shí),,gcc,會(huì)完成預(yù)處理、

12、編譯、匯編和連接。前三步分別生成目標(biāo)文件,連接時(shí),把生成的目標(biāo)文件鏈接成可執(zhí)行文件。,gcc,可以針對(duì)支持不同的源程序文件進(jìn)行不同處理,文件格式以文件的后綴來(lái)識(shí)別。,3.4,使用優(yōu)化選項(xiàng),當(dāng)用,gcc,編譯,C,代碼時(shí),它會(huì)試著用最少的時(shí)間完成編譯并且使編譯后的代碼易于調(diào)試,.,易于調(diào)試意味著編譯后的代碼與源代碼有同樣的執(zhí)行次序,編譯后的代碼沒(méi)有經(jīng)過(guò)優(yōu)化。有很多選項(xiàng)可用于告訴,gcc,,在耗費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性的基礎(chǔ)上,產(chǎn)生更小更快的可執(zhí)行文件。這些選項(xiàng)中最典型的是,-O,和,-O2,選項(xiàng)。,-O,選項(xiàng)告訴,gcc,對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行的更快。,-

13、O2,選項(xiàng)告訴,gcc,產(chǎn)生盡可能小和盡可能快的代碼。,-O2,選項(xiàng)將使編譯的速度比使用,-O,時(shí)慢。但通常產(chǎn)生的代碼執(zhí)行速度會(huì)更快。,3.5,使用調(diào)試和剖析選項(xiàng),GCC,支持?jǐn)?shù)種調(diào)試和剖析選項(xiàng)。在這些選項(xiàng)里最常用的是,-g,和,-pg,選項(xiàng)。,-g,選項(xiàng)告訴,gcc,產(chǎn)生能被,GNU,調(diào)試器使用的調(diào)試信息以便調(diào)試程序。,gcc,提供了一個(gè)很多其他,C,編譯器里沒(méi)有的特性,在,gcc,里能使,-g,和,-O(,產(chǎn)生優(yōu)化代碼,),連用。這一點(diǎn)非常有用,因?yàn)槟茉谂c最終產(chǎn)品盡可能相近的情況下調(diào)試代碼。同時(shí)使用這兩個(gè)選項(xiàng)時(shí)必須清楚所寫(xiě)的某些代碼已經(jīng)在優(yōu)化時(shí)被,gcc,作了改動(dòng)。,-pg,選項(xiàng)告訴,gc

14、c,在程序里加入額外的代碼,執(zhí)行時(shí),產(chǎn)生,gprof,用的剖析信息以顯示程序的耗時(shí)情況。,4.,使用,GNU make,編輯,makefile,4.1,準(zhǔn)備工作,要使用,make,,必須編寫(xiě)一個(gè)叫做,Makefile,的文件,這個(gè)文件描述了軟件包中文件之間的關(guān)系,提供更新每個(gè)文件的命令。一般在一個(gè)軟件包里,通常是可執(zhí)行文件靠目標(biāo)文件來(lái)更新,目標(biāo)文件靠編譯源文件來(lái)更新。,Makefile,寫(xiě)好之后,每次改變了某些源文件,只要執(zhí)行,make,命令:,# make,所有必要的重新編譯將執(zhí)行。,Make,程序利用,makefile,中的數(shù)據(jù)和每個(gè)文件的最后修改時(shí)間來(lái)確定那個(gè)文件需要更新,對(duì)于需要更新的

15、文件,,make,程序執(zhí)行,makefile,數(shù)據(jù)中定義的命令來(lái)更新。,4.2,makefile,文件的基本結(jié)構(gòu),GNU make,的主要功能是讀進(jìn)一個(gè)文本文件,makefile,并根據(jù),makefile,的內(nèi)容執(zhí)行一系列的工作。,makefile,的默認(rèn)文件名為,GNUmakefile,、,makefile,或,Makefile,,當(dāng)然也可以在,make,的命令行中指定別的文件名。如果不特別指定,,make,命令在執(zhí)行時(shí)將按順序查找默認(rèn)的,makefile,文件。多數(shù),Linux,程序員使用第三種文件名,Makefile,。因?yàn)榈谝粋€(gè)字母是大寫(xiě),通常被列在一個(gè)目錄的文件列表的最前面。,Mak

16、efile,是一個(gè)文本形式的數(shù)據(jù)庫(kù)文件,其中包含一些規(guī)則來(lái)告訴,make,處理哪些文件以及如何處理這些文件。這些規(guī)則主要是描述哪些文件(稱(chēng)為,target,目標(biāo)文件,不要和編譯時(shí)產(chǎn)生的目標(biāo)文件相混淆)是從哪些別的文件(稱(chēng)為,dependency,依賴(lài)文件)中產(chǎn)生的,以及用什么命令(,command,)來(lái)執(zhí)行這個(gè)過(guò)程。,依靠這些信息,,make,會(huì)對(duì)磁盤(pán)上的文件進(jìn)行檢查,如果目標(biāo)文件的生成或被改動(dòng)時(shí)的時(shí)間(稱(chēng)為該文件時(shí)間戳)至少比它的一個(gè)依賴(lài)文件還舊的話(huà),,make,就執(zhí)行相應(yīng)的命令,以更新目標(biāo)文件。目標(biāo)文件不一定是最后的可執(zhí)行文件,可以是任何一個(gè)中間文件并可以作為其他目標(biāo)文件的依賴(lài)文件。,一個(gè)

17、,Makefile,文件主要含有一系列的規(guī)則,每條規(guī)則包含以下內(nèi)容。,一個(gè)目標(biāo)(,target,),即,make,最終需要?jiǎng)?chuàng)建的文件,如可執(zhí)行文件和目標(biāo)文件;目標(biāo)也可以是要執(zhí)行的動(dòng)作,如“,clean”,。,一個(gè)或多個(gè)依賴(lài)文件(,dependency,)列表,通常是編譯目標(biāo)文件所需要的其他文件。,一系列命今,(command),,是,make,執(zhí)行的動(dòng)作,通常是把指定的相關(guān)文件編譯成目標(biāo)文件的編譯命令,每個(gè)命令占一行,且每個(gè)命令行的起始字符必須為,TAB,字符。,例如,有以下的,Makefile,文件:,#,一個(gè)簡(jiǎn)單的,Makefile,的例子,#,以,#,開(kāi)頭的為注釋行,test,:,pro

18、g.o,code.o,gcc,o test,prog.o,code.o,prog.o,:,prog.c,prog.h,code.h,gcc,c,prog.c,o,prog.o,code.o,:,code.c,code.h,gcc,c,code.c,o,code.o,clean,:,rm,f *.o,上面的,Makefile,文件中共定義了四個(gè)目標(biāo):,test,、,prog.o,、,code.o,和,clean,。目標(biāo)從每行的最左邊開(kāi)始寫(xiě),后面跟一個(gè)冒號(hào)(:),如果有與這個(gè)目標(biāo)有依賴(lài)性的其他目標(biāo)或文件,把它們列在冒號(hào)后面,并以空格隔開(kāi)。然后另起一行開(kāi)始寫(xiě)實(shí)現(xiàn)這個(gè)目標(biāo)的一組命令。在,Makefil

19、e,中,可使用續(xù)行號(hào)(,)將一個(gè)單獨(dú)的命令行延續(xù)成幾行。但要注意在續(xù)行號(hào)(,)后面不能跟任何字符(包括空格和鍵)。,一般情況下,調(diào)用,make,命令可輸入:,# make target,target,是,Makefile,文件中定義的目標(biāo)之一,如果省略,target,,,make,就將生成,Makefile,文件中定義的第一個(gè)目標(biāo)。對(duì)于上面,Makefile,的例子,單獨(dú)的一個(gè)“,make”,命令等價(jià)于:,# make test,因?yàn)?test,是,Makefile,文件中定義的第一個(gè)目標(biāo),,make,首先將其讀入,然后從第一行開(kāi)始執(zhí)行,把第一個(gè)目標(biāo),test,作為它的最終目標(biāo),所有后面的目標(biāo)

20、的更新都會(huì)影響到,test,的更新。第一條規(guī)則說(shuō)明只要文件,test,的時(shí)間戳比文件,prog.o,或,code.o,中的任何一個(gè)舊,下一行的編譯命令將會(huì)被執(zhí)行。,但是,在檢查文件,prog.o,和,code.o,的時(shí)間戳之前,,make,會(huì)在下面的行中尋找以,prog.o,和,code.o,為目標(biāo)的規(guī)則,在第三行中找到了關(guān)于,prog.o,的規(guī)則,該文件的依賴(lài)文件是,prog.c,、,prog.h,和,code.h,。同樣,,make,會(huì)在后面的規(guī)則行中繼續(xù)查找這些依賴(lài)文件的規(guī)則,如果找不到,則開(kāi)始檢查這些依賴(lài)文件的時(shí)間戳,如果這些文件中任何一個(gè)的時(shí)間戳比,prog.o,的新,,make,將

21、執(zhí)行“,gcc,c,prog.c,o,prog.o,”,命令,更新,prog.o,文件。,以同樣的方法,接下來(lái)對(duì)文件,code.o,做類(lèi)似的檢查,依賴(lài)文件是,code.c,和,code.h,。當(dāng),make,執(zhí)行完所有這些套嵌的規(guī)則后,,make,將處理最頂層的,test,規(guī)則。如果關(guān)于,prog.o,和,code.o,的兩個(gè)規(guī)則中的任何一個(gè)被執(zhí)行,至少其中一個(gè),.o,目標(biāo)文件就會(huì)比,test,新,那么就要執(zhí)行,test,規(guī)則中的命令,因此,make,去執(zhí)行,gcc,命令將,prog.o,和,code.o,連接成目標(biāo)文件,test,。,在上面,Makefile,的例子中,還定義了一個(gè)目標(biāo),cle

22、an,,它是,Makefile,中常用的一種專(zhuān)用目標(biāo),即刪除所有的目標(biāo)模塊。,現(xiàn)在來(lái)看一下,make,做的工作:首先,make,按順序讀取,makefile,中的規(guī)則,然后檢查該規(guī)則中的依賴(lài)文件與目標(biāo)文件的時(shí)間戳哪個(gè)更新,如果目標(biāo)文件的時(shí)問(wèn)戳比依賴(lài)文件還早,就按規(guī)則中定義的命令更新目標(biāo)文件。如果該規(guī)則中的依賴(lài)文件又是其他規(guī)則中的目標(biāo)文件,那么依照規(guī)則鏈不斷執(zhí)行這個(gè)過(guò)程,直到,Makefile,文件的結(jié)束,至少可以找到一個(gè)不是規(guī)則生成的最終依賴(lài)文件,獲得此文件的時(shí)間戳,然后從下到上依照規(guī)則鏈執(zhí)行目標(biāo)文件的時(shí)間戳比此文件時(shí)間戳舊的規(guī)則,直到最頂層的規(guī)則。,通過(guò)以上的分析過(guò)程,可以看到,make,的

23、優(yōu)點(diǎn),因?yàn)?.o,目標(biāo)文件依賴(lài),.c,源文件,源碼文件里一個(gè)簡(jiǎn)單改變都會(huì)造成那個(gè)文件被重新編譯,并根據(jù)規(guī)則鏈依次由下到上執(zhí)行編譯過(guò)程,直到最終的可執(zhí)行文件被重新連接。例如,當(dāng)改變一個(gè)頭文件的時(shí)候,由于所有的依賴(lài)關(guān)系都在,Makefile,里,因此不再需要記住依賴(lài)此頭文件的所有源碼文件,,make,可以自動(dòng)的重新編譯所有那些因依賴(lài)這個(gè)頭文件而改變了的源碼文件,如果需要,再進(jìn)行重新連接。,4.3,Makefile,中的變量,Makefile,里的變量就像一個(gè)環(huán)境變量。事實(shí)上,環(huán)境變量在,make,中也被解釋成,make,的變量。這些變量對(duì)大小寫(xiě)敏感,一般使用大寫(xiě)宇母。幾乎可以從任何地方引用定義的變

24、量,變量的主要作用如下:,保存文件名列表。在前面的例子里,作為依賴(lài)文件的一些目標(biāo)文件名出現(xiàn)在可執(zhí)行文件的規(guī)則中,而在這個(gè)規(guī)則的命令行里同樣包含這些文件并傳遞給,gcc,做為命令參數(shù)。如果使用一個(gè)變量來(lái)保存所有的目標(biāo)文件名,則可以方便地加入新的目標(biāo)文件而且不易出錯(cuò)。,保存可執(zhí)行命令名,如編譯器。在不同的,Linux,系統(tǒng)中存在著很多相似的編譯器系統(tǒng),這些系統(tǒng)在某些地方會(huì)有細(xì)微的差別,如果項(xiàng)目被用在一個(gè)非,gcc,的系統(tǒng)里,則必須將所有出現(xiàn)編譯器名的地方改成用新的編譯器名。但是如果使用一個(gè)變量來(lái)代替編譯器名,那么只需要改變?cè)撟兞康闹?。其他所有地方的命令名就都改變了?保存編譯器的參數(shù)。在很多源代碼

25、編譯時(shí),,gcc,需要很長(zhǎng)的參數(shù)選項(xiàng),在很多情況下,所有的編譯命令使用一組相同的選項(xiàng),如果把這組選項(xiàng)使用一個(gè)變量代表,那么可以把這個(gè)變量放在所有引用編譯器的地方。當(dāng)要改變選項(xiàng)的時(shí)候,只需改變一次這個(gè)變量的內(nèi)容即可。,Makefile,中的變量是用一個(gè)文本串在,Makefile,中定義的,這個(gè)文本串就是變量的值。只要在一行的開(kāi)始寫(xiě)下這個(gè)變量的名字,后面跟一個(gè)“”號(hào),以及要設(shè)定這個(gè)變量的值即可定義變量,下面是定義變量的語(yǔ)法:,VARNAME=string,使用時(shí),把變量用括號(hào)括起來(lái),并在前面加上,$,符號(hào),就可以引用變量的值:,$VARNAME,make,解釋規(guī)則時(shí),,VARNAME,在等式右端展

26、開(kāi)為定義它的字符串。變量一般都在,Makefile,的頭部定義。按照慣例,所有的,Makefile,變量都應(yīng)該是大寫(xiě)。如果變量的值發(fā)生變化,就只需要在一個(gè)地方修改,從而簡(jiǎn)化了,Makefile,的維護(hù)。,現(xiàn)在利用變量把前面的,Makefile,重寫(xiě)一遍:,OBJS=,prog.o,code.o,CC=,gcc,test,:,$ OBJS ,$ CC o test $ OBJS ,prog.o,:,prog.c,prog.h,code.h,$ CC c,prog.c,o,prog.o,code.o,:,code.c,code.h,$ CC c,code.c,o,code.o,clean,:,rm

27、,f *.o,如:源程序?yàn)?經(jīng)過(guò)變量替換過(guò)后的,makefile,文件:,除用戶(hù)自定義的變量外,,make,還允許使用環(huán)境變量、自動(dòng)變量和預(yù)定義變量。使用環(huán)境變量的方法很簡(jiǎn)單,在,make,啟動(dòng)時(shí),,make,讀取系統(tǒng)當(dāng)前已定義的環(huán)境變量,并且創(chuàng)建與之同名同值的變量,因此用戶(hù)可以像在,shell,中一樣在,Makefile,中方便的引用環(huán)境變量。需要注意的是,如果用戶(hù)在,Makefile,中定義了同名的變量,用戶(hù)自定義變量將覆蓋同名的環(huán)境變量。此外,,Makefile,中還有一些預(yù)定義變量和自動(dòng)變量,但是看起來(lái)并不像自定義變量那樣直觀。,4.4,Makefile,的隱含規(guī)則,在上面的例子中,幾

28、個(gè)產(chǎn)生目標(biāo)文件的命令都是從“,.c”,的,C,語(yǔ)言源文件和相關(guān)文件通過(guò)編譯產(chǎn)生“,.o”,目標(biāo)文件,這也是一般的步驟。實(shí)際上,,make,可以使工作更加自動(dòng)化,也就是說(shuō),,make,知道一些默認(rèn)的動(dòng)作,它有一些稱(chēng)作隱含規(guī)則的內(nèi)置的規(guī)則,這些規(guī)則告訴,make,當(dāng)用戶(hù)沒(méi)有完整地給出某些命令的時(shí)候,應(yīng)該怎樣執(zhí)行。,例如,把生成,prog.o,和,code.o,的命令從規(guī)則中刪除,,make,將會(huì)查找隱含規(guī)則,然后會(huì)找到并執(zhí)行一個(gè)適當(dāng)?shù)拿睢S捎谶@些命令會(huì)使用一些變量,因此可以通過(guò)改變這些變量來(lái)定制,make,。象在前面的例子中所定義的那樣,,make,使用變量,CC,來(lái)定義編譯器,并且傳遞變量,C

29、FLAGS,(編譯器參數(shù))、,CPPFLAGS,(,C,語(yǔ)言預(yù)處理器參數(shù))、,TARGET_ARCH,(目標(biāo)機(jī)器的結(jié)構(gòu)定義)給編譯器,然后加上參數(shù),-c,,后面跟變量,$,(第一個(gè)依賴(lài)文件名),然后是參數(shù),-o,加變量,$,(目標(biāo)文件名)。綜上所述,一個(gè),C,編譯的具體命令將會(huì)是:,$ CC $ CFLAGS $ CPPFLAGS $ TARGET_ARCH c $ -o $,在上面的例子中,利用隱含規(guī)則,可以簡(jiǎn)化為:,OBJS=,prog.o,code.o,CC=,gcc,test,:,$ OBJS ,$ CC o $ $,prog.o,:,prog.c,prog.h,code.h,code

30、.o,:,code.c,code.h,clean,:,rm,f *.o,5,調(diào)試工具,GDB,5.1 GDB,調(diào)試器簡(jiǎn)介,Linux,系統(tǒng)中包含了,GNU,調(diào)試程序,gdb,,它是一個(gè)用來(lái)調(diào)試,C,和,C+,程序的調(diào)試器??梢允钩绦蜷_(kāi)發(fā)者在程序運(yùn)行時(shí)觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。,gdb,所提供的一些功能如下所示:,運(yùn)行程序,設(shè)置所有的能影響程序運(yùn)行的參數(shù)和環(huán)境;,控制程序在指定的條件下停止運(yùn)行;,當(dāng)程序停止時(shí),可以檢查程序的狀態(tài);,修改程序的錯(cuò)誤,并重新運(yùn)行程序;,動(dòng)態(tài)監(jiān)視程序中變量的值;,可以單步執(zhí)行代碼,觀察程序的運(yùn)行狀態(tài)。,gdb,的功能非常強(qiáng)大,到目前為止,,gdb,已能夠支持

31、,Moduls-2,、,Chill,、,Pascal,和,FORTRAN,程序的調(diào)試,但是調(diào)試這些語(yǔ)言的源程序時(shí)有一些功能還不能使用。例如調(diào)試,FORTRAN,程序時(shí)還不支持表達(dá)式的輸入、輸出變量或類(lèi),FORTRAN,的詞法。,gdb,程序調(diào)試的對(duì)象是可執(zhí)行文件,而不是程序的源代碼文件。然而,并不是所有的可執(zhí)行文件都可以用,gdb,調(diào)試。如果要讓產(chǎn)生的可執(zhí)行文件可以用來(lái)調(diào)試,需在執(zhí)行,gcc,指令編譯程序時(shí),加上,-g,參數(shù),指定程序在編譯時(shí)包含調(diào)試信息。調(diào)試信息包含程序里的每個(gè)變量的類(lèi)型和在可執(zhí)行文件里的地址映射以及源代碼的行號(hào)。,gdb,利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)。,5.2 GDB

32、,命令的基本使用和應(yīng)用,1,gdb,基本命令,還可以用下面的方式來(lái)運(yùn)行,gdb,:,gdb,filename,其中,,filename,是要調(diào)試的可執(zhí)行文件。用這種方式運(yùn)行,gdb,可以直接指定想要調(diào)試的程序。這和啟動(dòng),gdb,后執(zhí)行,file filename,命令效果完全一樣。也可以用,gdb,去檢查一個(gè)因程序異常終止而產(chǎn)生的,core,文件,或者與一個(gè)正在運(yùn)行的程序相連。,gdb,支持很多的命令且能實(shí)現(xiàn)不同的功能。這些命令從簡(jiǎn)單的文件裝入到允許你檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令,下面列出了在使用,gdb,調(diào)試時(shí)會(huì)用到的一些命令。,1,),file,命令:裝入想要調(diào)試的可執(zhí)行文件。,2,),

33、cd,命令:改變工作目錄。,3,),pwd,命令:返回當(dāng)前工作日錄。,4,),run,命令:執(zhí)行當(dāng)前被調(diào)試的程序。,5,),kill,命令:停止正在調(diào)試的應(yīng)用程序。,6,),list,命令:列出正在調(diào)試的應(yīng)用程序的源代碼。,7,),break,命令:設(shè)置斷點(diǎn)。,8,),Tbreak,命令;設(shè)置臨時(shí)斷點(diǎn)。它的語(yǔ)法與,break,相同。區(qū)別在于用,tbreak,設(shè)置的斷點(diǎn)執(zhí)行一次之后立即消失。,9,),watch,命令:設(shè)置監(jiān)視點(diǎn),監(jiān)視表達(dá)式的變化。,10,),awatch,命令:設(shè)置讀寫(xiě)監(jiān)視點(diǎn)。當(dāng)要監(jiān)視的表達(dá)式被讀或?qū)憰r(shí)將應(yīng)用程序掛起。它的語(yǔ)法與,watch,命令相同。,11,),rwatch,

34、命令:設(shè)置讀監(jiān)視點(diǎn),當(dāng)監(jiān)視表達(dá)式被讀時(shí)將程序掛起,等侍調(diào)試。此命令的語(yǔ)法與,watch,相同。,12,),next,命令:執(zhí)行下一條源代碼,但是不進(jìn)入函數(shù)內(nèi)部。也就是說(shuō),將一條函數(shù)調(diào)用作為一條語(yǔ)句執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng),run,,開(kāi)始了代碼的執(zhí)行。,13,),step,命令:執(zhí)行下一條源代碼,進(jìn)入函數(shù)內(nèi)部。如果調(diào)用了某個(gè)函數(shù),會(huì)跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個(gè)命令的前提是已經(jīng)用,run,開(kāi)始執(zhí)行代碼。,14,),display,命令:在應(yīng)用程序每次停止運(yùn)行時(shí)顯示表達(dá)式的值。,15,),info break,命令:顯示當(dāng)前斷點(diǎn)列表,包括每個(gè)斷點(diǎn)到達(dá)的次數(shù)。,16,),info files,命令:顯示調(diào)試文件的信息。,17,),info,func,命令:顯示所有的函數(shù)名。,18,),info local,命令:顯示當(dāng)前函數(shù)的所有局部變量的信息。,19,),info,prog,命令:顯示調(diào)試程序的執(zhí)行狀態(tài)。,20,),print,命令;顯示表達(dá)式的值。,21,),delete,命令:刪除斷點(diǎn)。指定一個(gè)斷點(diǎn)號(hào)碼,則刪除指定斷點(diǎn)。不指定參數(shù)則刪除所有的斷點(diǎn)。,22,),Shell,命令:執(zhí)行,Linux Shell,命令。,23,),make,命令:不退出,gdb,而重新編譯生成可執(zhí)行文件。,24,),Quit,命令:退出,gdb,。,

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

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話(huà):18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶(hù)上傳的文檔直接被用戶(hù)下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!