




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、gcc gdb makegcc gdb make講師:朱景堯C語言語言C+語言語言 傳智播客傳智播客http:/高薪就業(yè)高薪就業(yè)ContentsContentsgcc gdbmake 第第1 1章章 gccgcc GNU CC(通常稱為GCC)是GNU項(xiàng)目的編譯器,它能夠編譯C、C+語言編寫的程序。gcc是Linux開發(fā)的基礎(chǔ),gcc能夠支持多種不同的C語言版本,同時提供Linux、Unix、Windows下的編譯版本。目前Windows下C/C+主要的編譯器有Borland C+、VC+,但由于gcc是免費(fèi)的,同時對代碼的兼容性做的更加出色,所以在windows的C/C+編譯器市場gcc的份
2、額也越來越大。第第1 1章章 gccgcc u使用gcc,程序員可以對編譯過程有更多的控制,編譯過程分為3個階段。預(yù)處理;匯編;鏈接。u程序員可以再編譯的任何階段結(jié)束后停止整個編譯過程以檢查編譯器在該階段輸出的信息。第第1 1章章 gccgcc u使用gcc,程序員可以控制生成二進(jìn)制執(zhí)行文件中調(diào)試代碼的數(shù)量和類型。u和其他編譯器一樣,gcc也可以優(yōu)化執(zhí)行代碼。ugcc是個交叉平臺編譯器,所以能夠在當(dāng)前CPU平臺上為不同操作系統(tǒng)開發(fā)軟件。ugcc對C和C+進(jìn)行了一些擴(kuò)展,有助于提高執(zhí)行效率以及編譯器進(jìn)行代碼優(yōu)化。ugcc可以讓跨平臺編程更加容易,降低代碼移植代價。第第1 1章章 gccgcc u
3、深入了解gcc之前,我們先看一個小例子。#include int main(int arg, char *args)if (arg 3)printf(請輸入2個參數(shù)n);elseint a = atoi(args1);int b = atoi(args2);printf(%d 加 %d 等于 %dn, a, b, a + b);return 0;第第1 1章章 gccgcc u在命令行鍵入命令編譯和運(yùn)行這段程序$gcc -o hello hello.cu這行命令告訴gcc對源程序hello.c進(jìn)行編譯和鏈接,并使用參數(shù)-o指定創(chuàng)建名為hello的可執(zhí)行程序。u整個過程看上去仿佛是一氣呵成的,但
4、其實(shí)是分幾步的預(yù)編譯源代碼;編譯目標(biāo)代碼;鏈接程序。第第1 1章章 gccgcc 源代碼*.c預(yù)處理器編譯器目標(biāo)代理*.o鏈接器可執(zhí)行文件頭文件*.h庫代碼第第1 1章章 gccgcc u預(yù)編譯在命令行鍵入命令。$gcc -o hello1.c -E hello.c這行命令告訴gcc對源程序hello.c進(jìn)行預(yù)編譯,預(yù)編譯結(jié)果輸出到hello1.c文件中。第第1 1章章 gccgcc u編譯在命令行鍵入命令。$gcc -o hello.o -c hello1.c這行命令告訴gcc對源程序hello.c進(jìn)行編譯,但不鏈接,編譯輸出到hello.o文件中。第第1 1章章 gccgcc u鏈接在命令
5、行鍵入命令。$gcc -o hello hello.o這行命令告訴gcc對源程序hello.o進(jìn)行鏈接,生成可執(zhí)行程序hello。第第1 1章章 gccgcc常用選項(xiàng)常用選項(xiàng) -o filename輸出文件名,如果沒指定filename,默認(rèn)為a.out-c只編譯,不鏈接-E預(yù)編譯-S匯編-g包含調(diào)試信息-I指定包含頭文件路徑-D編譯時定義指定的宏,相當(dāng)于源代碼中的#define宏定義-L指定要鏈接庫文件的路徑-l鏈接指定的庫文件-O優(yōu)化編譯后的代碼-w關(guān)閉所有告警信息-Wall開啟所有告警信息-WerrorWarning當(dāng)做錯誤處理-static強(qiáng)制鏈接時鏈接靜態(tài)庫-fPIC編譯與位置無關(guān)的
6、代碼,主要用于編譯共享庫-shared生成共享庫so文件-pedantic發(fā)現(xiàn)一些不符合 ANSI/ISO C標(biāo)準(zhǔn)的代碼第第1 1章章 gccgcc ugcc是如何知道文件類型呢?通過文件擴(kuò)展名判斷文件類型擴(kuò)展名含 義cC語言源文件cppC+源文件s匯編語言源文件o編譯后的目標(biāo)代碼文件a,so編譯后的庫文件ContentsContentsgcc gdbmake 第三章第三章 makemakeu除非最簡單的項(xiàng)目,任何一個商業(yè)項(xiàng)目都會包含多個源代碼,而且在編譯的時候會有很長很復(fù)雜的指令。u編程過程中還需要使用那些很少而且很難記憶的編譯選項(xiàng)。umake是一種控制編譯或者重復(fù)編譯軟件的工具。umake
7、可以自動管理軟件的編譯內(nèi)容、方式和時機(jī),從而使程序員把更多的精力集中在編寫代碼上。第三章第三章 makemakeumake是怎么完成工作的呢?umakefile是一個文本形式的腳本文件,其中包含一些規(guī)則告訴make編譯哪些文件,怎么樣編譯以及在什么條件下編譯。umakefile規(guī)則遵循以下通用形式target:dependency dependencycommandcommandu每個command第一個字符必須是tab鍵,而不是空格鍵,不然make會報錯并停止。第三章第三章 makemakeu用vi編輯一個簡單的makefile,內(nèi)容如下:start:gcc -o hello hello.c
8、u輸入make,makefile的內(nèi)容執(zhí)行了。第三章第三章 makemakeu稍微復(fù)雜的makefile,內(nèi)容如下:start:hello.o gcc -o hello hello.ohello.o: gcc -o hello.o -c hello.cutarget start后面的hello.o代表其下的command依賴與hello.o這個target。所以make先執(zhí)行了hello.o這個target下的command。第三章第三章 makemakeu進(jìn)一步完善的makefile,內(nèi)容如下:start:hello.o gcc -o hello hello.ohello.o: gcc -o
9、 hello.o -c hello.cclean: rm -f hello.ou增加了target clean。u輸入make clean,make會直接執(zhí)行clean其下的command。第三章第三章 makemakeu在makefile執(zhí)行shell命令:start:hello.o gcc -o hello hello.o echo -ok-hello.o: gcc -o hello.o -c hello.cclean: rm -f hello.o增加了target cleanu增加了echo,顯示編譯成功語句,為了不將語句本身輸出,所以前面加符號。第三章第三章 makemakeu為了簡化
10、編輯和維護(hù)makefile,可以在makefile中使用變量。varname=some_textu把變量用括號括起來,前面加$就可以引用該變量的值。$(varname)u按照慣例makefile的變量都是大寫(只是習(xí)慣而已,不是必須的)。第三章第三章 makemakeu 在makefile使用變量:CC=gccstart:hello.o $(CC) -o hello hello.o echo -ok-hello.o: $(CC) -o hello.o -c hello.cclean: rm -f hello.ou 增加變量CC,每個引用變量CC的地方的展開成變量的值。第三章第三章 makema
11、keu 在makefile使用變量:CC=gccSRCS=hello.cOBJS=hello.oEXEC=hellostart:hello.o $(CC) -o $(EXEC) $(OBJS) echo -ok-hello.o: $(CC) -o $(OBJS) -c $(SRCS) clean: rm -f hello.ou 增加變量SRCS、OBJS、EXEC,每個引用變量CC的地方的展開成變量的值。第三章第三章 makemakeu 在makefile使用變量:CC=gccSRCS=hello.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:hello.o $(CC)
12、 -o $(EXEC) $(OBJS) echo -ok-hello.o: $(CC) -o $(OBJS) -c $(SRCS) clean: rm -f hello.ou OBJS=$(SRCS:.c=.o),意思是將SRCS變量中的.c替換為.o。第三章第三章 makemakeu模式規(guī)則.SUFFIXES:.c .ou表示任何x.c文件與x.o關(guān)聯(lián).c.o:u表示make定義了一條規(guī)則,任何x.o文件都從 x.c編譯而來umake定義了一些有用的預(yù)定義變量變量名含 義$規(guī)則的目標(biāo)所對應(yīng)的文件名$規(guī)則中的第一個相關(guān)文件名第三章第三章 makemakeu 在makefile使用自動變量和模式
13、規(guī)則的例子.SUFFIXES:.c .oCC=gccSRCS=hello.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:$(OBJS) $(CC) -o $(EXEC) $(OBJS) echo -ok-.c.o: $(CC) -o $ -c $ clean: rm -f $(OBJS)第三章第三章 makemakeu 在makefile同時編譯多個源文件的例子.SUFFIXES:.c .oCC=gccSRCS=hello.cpub.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:$(OBJS) $(CC) -o $(EXEC) $(OBJS) e
14、cho -ok-.c.o: $(CC) -o $ -c $ clean: rm -f $(OBJS)第三章第三章 makemakeu常見的make出錯信息:No rule to make target target.Stopmakefile中沒有包含創(chuàng)建指定target所需要的規(guī)則,而且也沒有默認(rèn)規(guī)則可用。target is up to date 指定的target相關(guān)文件沒有變化。command:Command not foundmake找不到命令,通常是因?yàn)槊畋黄磳戝e誤或者不在$PATH路徑下。ContentsContentsgcc gdbmake 第第2 2章章 gdbgdb u雖然我
15、們非常不愿意承認(rèn),但軟件中還是有錯誤存在。u調(diào)試是程序員必修的課程,如果不懂調(diào)試,那么日后寫程序的時候修正代碼bug會付出大量的時間和精力。ugdb即GNU debugger。第第2 2章章 gdbgdb u第一章中提到的,gcc編譯選項(xiàng)-g,這樣生成的目標(biāo)代碼中就添加了調(diào)試信息。gcc -g o hello hello.cugdb完成的大部分工作都可以用很少的命令集合完成。第第2 2章章 gdbgdb u啟動gdbgdb 程序名 corefileucorefile是可選的,但能增強(qiáng)gdb的調(diào)試能力。uLinux默認(rèn)是不生成corefile的,所以需要在用戶profile文件中添加ulimit
16、 -c unlimitedu修改完成之后讓profile文件及時生效第第2 2章章 gdbgdb u一個有錯的程序#include void test(void)int *i = NULL;*i = 2;int main(void)printf(“hello worldn”);test();return 0;第第2 2章章 gdbgdb u編譯這個程序gcc g o hello hello.cu運(yùn)行helloSegmentation fault (core dumped)u程序崩潰lscore.3563 hello hello.cu我們看到除了hello文件和hello.c文件之外多了core
17、文件第第2 2章章 gdbgdb u啟動gdbgdb hello coreu如果你不喜歡一大堆的軟件信息,可以通過-q參數(shù)關(guān)閉軟件信息gdb -q hello core#0 0 x08048394 in test () at hello.c:55 *i = 2;u可以看到gdb通過core告訴你,程序哪條語句出現(xiàn)問題第第2 2章章 gdbgdb u我們做的第一件事就是在gdb環(huán)境中運(yùn)行這個程序gdb hellourun命令。Starting program: /home/test/1/hello hello worldProgram received signal SIGSEGV, Segme
18、ntation fault.0 x08048394 in test () at hello.c:55 *i = 2;ugdb不但能顯示出錯行號,還能說明出錯出現(xiàn)時的內(nèi)存地址,這個也是潛在的有用信息。第第2 2章章 gdbgdb utest函數(shù)到底出了什么問題?uwhere命令,顯示導(dǎo)致段錯誤的執(zhí)行函數(shù)樹#0 0 x08048394 in test () at hello.c:5#1 0 x080483be in main () at hello.c:11u問題出在hello.c文件的第5行。第第2 2章章 gdbgdb u知道函數(shù)出錯行的上下文對調(diào)試程序是很有幫助的。ulist m,n,m,n
19、是要顯示包含錯誤首次出現(xiàn)位置的起始行和結(jié)尾行。不帶參數(shù)的list將顯示附近的10行代碼1 #include 2 void test(void)3 4 int *i = NULL;5 *i = 2;6 78 int main(void)9 10 printf(hello worldn);#0 0 x08048394 in test () at hello.c:5#1 0 x080483be in main () at hello.c:第第2 2章章 gdbgdb ugdb最有用的功能之一就是它可以顯示被調(diào)試程序中任何表達(dá)式、變量的值。uprint 變量,表達(dá)式。uprint file:變量,表達(dá)
20、式,是必須的,以便讓gdb知道指的是一個文件名。uprint funcname:變量,表達(dá)式(gdb) print i$1 = (int *) 0 x0u顯示指針變量i的值為0。uwhatis 命令可以告訴你變量的類型, ptype 告訴你結(jié)構(gòu)的定義。(gdb) whatis itype = int *第第2 2章章 gdbgdb ubreak命令設(shè)置斷點(diǎn)break linenumbreak funcnamebreak filename:linenumbreak filename:第第2 2章章 gdbgdb u退出gdb,重新進(jìn)入調(diào)試模式ugdb -q hello(gdb) break 4Breakpoint 1 at 0 x804838a: file hello.c, line 4.(gdb) runStarting program: /home/test/1/hello hello worldBreakpoint 1, te
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社會參與老年男性的社會責(zé)任感與擔(dān)當(dāng)
- 二零二五年度婚姻財(cái)產(chǎn)約定與家庭資產(chǎn)配置優(yōu)化協(xié)議
- 二零二五年度小區(qū)綠化環(huán)境監(jiān)測與改善合同
- 二零二五年度餐飲業(yè)廚師技能競賽合作協(xié)議
- 二零二五年度物業(yè)服務(wù)企業(yè)資質(zhì)認(rèn)定合同
- 二零二五年度酒店KTV包間租賃及音響設(shè)備使用協(xié)議
- 2025年度環(huán)保產(chǎn)業(yè)無合同用工賠償標(biāo)準(zhǔn)及執(zhí)行辦法
- 二零二五年度存款贈與與財(cái)富管理服務(wù)合同
- 二零二五年度托運(yùn)車輛合同:跨境車輛運(yùn)輸及清關(guān)服務(wù)
- 2025年度短視頻平臺主播藝人規(guī)范化簽約合同
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- GB/T 19342-2024手動牙刷一般要求和檢測方法
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 8款-組織架構(gòu)圖(可編輯)
- 中國郵政銀行“一點(diǎn)一策”方案介紹PPT課件
- 國內(nèi)外創(chuàng)造性思維培養(yǎng)模式的對比研究綜述
- 2022年露天煤礦安全資格證考試題庫-上(單選、多選題庫)
- 計(jì)價格(2002)10號文
- 青果巷歷史街區(qū)改造案例分析
- 樁身強(qiáng)度自動驗(yàn)算表格Excel
- 《鋼鐵是怎樣煉成的》讀書報告
評論
0/150
提交評論