版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《Linux網(wǎng)絡(luò)操作系統(tǒng)項(xiàng)目教程(RHEL8/CentOS8)》第9章使用gcc與make調(diào)試程序能力CAPACITY要求理解程序調(diào)試掌握利用gcc進(jìn)行調(diào)試地方法掌握使用make編譯地方法項(xiàng)目設(shè)計與準(zhǔn)備項(xiàng)目知識準(zhǔn)備項(xiàng)目實(shí)施一,項(xiàng)目知識準(zhǔn)備編譯時錯誤程序地錯誤被稱作臭蟲(Bug),而找到這些Bug并加以糾正地過程就叫做調(diào)試(Debug)。編譯器只能翻譯語法正確地程序,否則將導(dǎo)致編譯失敗,無法生成可執(zhí)行文件。一,項(xiàng)目知識準(zhǔn)備運(yùn)行時錯誤編譯器檢查不出錯誤,仍然可以生成可執(zhí)行文件,但在運(yùn)行時會出錯而導(dǎo)致程序崩潰。注意區(qū)分編譯時與運(yùn)行時(Run-time)這兩個概念,不僅在調(diào)試時需要區(qū)分這兩個概念,在學(xué)習(xí)C語言地很多語法時都需要區(qū)分這兩個概念,有些事情在編譯時做,有些事情則在運(yùn)行時做。一,項(xiàng)目知識準(zhǔn)備邏輯錯誤與語義錯誤第三類錯誤是邏輯錯誤與語義錯誤。如果程序里有邏輯錯誤,編譯與運(yùn)行都會很順利,看上去也不產(chǎn)生任何錯誤信息,但是程序沒有干它該干地事情,而是干了別地事情。當(dāng)然不管怎么樣,計算機(jī)只會按妳寫地程序去做,問題在于妳寫地程序不是妳真正想要地。這意味著程序地意思(即語義)是錯地。找到邏輯錯誤在哪兒需要十分清醒地頭腦,要通過觀察程序地輸出回過頭來判斷它到底在做什么。項(xiàng)目設(shè)計與準(zhǔn)備項(xiàng)目知識準(zhǔn)備項(xiàng)目實(shí)施二,項(xiàng)目設(shè)計與準(zhǔn)備項(xiàng)目設(shè)計與準(zhǔn)備本項(xiàng)目要用到Server01,完成地任務(wù)如下。(1)利用gcc進(jìn)行程序調(diào)試(2)使用make編譯程序其Server01地IP地址為192.168.10.1/24,計算機(jī)地網(wǎng)絡(luò)連接方式都是僅主機(jī)模式(VM1)。項(xiàng)目設(shè)計與準(zhǔn)備項(xiàng)目知識準(zhǔn)備項(xiàng)目實(shí)施三,項(xiàng)目實(shí)施任務(wù)9-1安裝gcc1.認(rèn)識gccgcc(GNUpilerCollection,GNU編譯器集合)是一套由GNU開發(fā)地編程語言編譯器。gcc原名為GNUC語言編譯器(GNUCpiler),因?yàn)樗局荒芴幚鞢語言。但gcc后來得到擴(kuò)展,變得既可以處理C++,又可以處理Fortran,Pascal,Objective-C,Java,以及Ada與其它語言。三,項(xiàng)目實(shí)施任務(wù)9-1安裝gcc2.安裝gcc(1)檢查是否安裝gcc。[root@Server01~]#rpm-qa|grepgcclibgcc-8.3.1-5.el8.x86_64上述結(jié)果表示未安裝gcc。三,項(xiàng)目實(shí)施任務(wù)9-1安裝gcc(2)如果系統(tǒng)還沒有安裝gcc軟件包,可以使用dnf命令安裝所需軟件包。①掛載ISO安裝映像://掛載光盤到/media下,前面項(xiàng)目1已建立yum源[root@Server01~]#mount/dev/cdrom/media②制作用于安裝地yum源文件:[root@Server01~]#vim/etc/yum.repos.d/dvd.repo[Media]name=Meidabaseurl=file:///media/BaseOSgpgcheck=0enabled=1[rhel8-AppStream]name=rhel8-AppStreambaseurl=file:///media/AppStreamgpgcheck=0enabled=1三,項(xiàng)目實(shí)施任務(wù)9-1安裝gcc③使用dnf命令查看gcc軟件包地信息,如圖9-1所示。[root@Server01~]#dnfinfogcc三,項(xiàng)目實(shí)施任務(wù)9-1安裝gcc④使用dnf命令安裝gcc。[root@Server01~]#dnfcleanall //安裝前先清除緩存[root@Server01~]#dnfinstallgcc-y所有軟件包安裝完畢,可以使用rpm命令再一次進(jìn)行查詢:rpm-qa|grepgcc。[root@Server01~]#rpm-qa|grepgcclibgcc-8.3.1-5.el8.x86_64gcc-8.3.1-5.el8.x86_64三,項(xiàng)目實(shí)施任務(wù)9-2單一程序:打印HelloWorld1.編輯程序代碼即源碼[root@Server01~]#vimhello.c<==用C語言寫地程序擴(kuò)展名建議用.c#include<stdio.h>intmain(void){printf("HelloWorld\n");}第一行地那個"#"并不是注解。三,項(xiàng)目實(shí)施任務(wù)9-2單一程序:打印HelloWorld2.開始編譯與測試運(yùn)行[root@Server01~]#gcchello.c[root@Server01~]#llhello.ca.out-rwxr-xr-x.1rootroot8512Jul1521:18a.out <==此時會生成這個文件名-rw-r--r--.1rootroot72Jul1521:17hello.c[root@Server01~]#./a.outHelloWorld <==運(yùn)行結(jié)果如果直接以gcc編譯源碼,并且沒有加上任何參數(shù),則執(zhí)行文件地文件名會被自動設(shè)置為a.out這個文件名,就能夠直接執(zhí)行./a.out這個執(zhí)行文件。即:hello.c就是源碼,而gcc就是編譯器,至于a.out就是編譯成功地可執(zhí)行文件。三,項(xiàng)目實(shí)施任務(wù)9-2單一程序:打印HelloWorld如果想要生成目的文件(objectfile)來進(jìn)行其它地操作,而且執(zhí)行文件地文件名也不要用默認(rèn)地a.out,那該如何做呢?修改編譯與測試:[root@Server01~]#gcc-chello.c[root@Server01~]#llhello*-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o<==這就是生成地目的文件[root@Server01~]#gcc-ohellohello.o <==小寫字母o![root@Server01~]#llhello*-rwxr-xr-x.1rootroot8512Jul1521:20hello<==這就是可執(zhí)行文件(-o地結(jié)果)-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o[root@Server01~]#./helloHelloWorld通過這個操作,可以得到hello及hello.o兩個文件,真正可以執(zhí)行地是hello這個二進(jìn)制文件(binaryprogram)。三,項(xiàng)目實(shí)施任務(wù)9-3主程序,子程序鏈接,子程序地編譯例子,以thanks.c這個主程序去調(diào)用thanks_2.c這個子程序:1.撰寫所需要地主程序,子程序[root@Server01~]#vimthanks.c#include<stdio.h>intmain(void){printf("HelloWorld\n");thanks_2();}上面地thanks_2()就是調(diào)用子程序![root@Server01~]#vimthanks_2.c#include<stdio.h>voidthanks_2(void){printf("Thankyou!\n");}三,項(xiàng)目實(shí)施任務(wù)9-3主程序,子程序鏈接,子程序地編譯例子,以thanks.c這個主程序去調(diào)用thanks_2.c這個子程序:2.進(jìn)行程序地編譯與鏈接(Link)(1)開始將源碼編譯成為可執(zhí)行地binaryfile(警告信息可忽略)。[root@Server01~]#gcc-cthanks.cthanks_2.c[root@Server01~]#llthanks*-rw-r--r--.1rootroot76Jul1521:27thanks_2.c-rw-r--r--.1rootroot1504Jul1521:27thanks_2.o<==編譯生成地目的文件!-rw-r--r--.1rootroot91Jul1521:25thanks.c-rw-r--r--.1rootroot1560Jul1521:27thanks.o <==編譯生成地目的文件![root@Server01~]#gcc-othanksthanks.othanks_2.o <==小寫字母o![root@Server01~]#llthanks*-rwxr-xr-x.1rootroot8584Jul1521:28thanks<==最終結(jié)果會生成可執(zhí)行文件(2)執(zhí)行可執(zhí)行文件。[root@Server01~]#./thanksHelloWorldThankyou!三,項(xiàng)目實(shí)施任務(wù)9-4調(diào)用外部函數(shù)庫:加入鏈接地函數(shù)庫例如,我們想要計算出三角函數(shù)里面地sin90°,代碼如下:[root@Server01~]#vimsin.c#include<stdio.h>#include<math.h>intmain(void){floatvalue;value=sin(3.14/2);printf("%f\n",value);}[root@Server01~]#gccsin.c-lm-L/lib-L/usr/lib<==重點(diǎn)在-lm1.000000[root@Server01~]#./a.out <==嘗試執(zhí)行新文件三,項(xiàng)目實(shí)施任務(wù)9-4調(diào)用外部函數(shù)庫:加入鏈接地函數(shù)庫特別注意,使用gcc編譯時所加入地那個-lm是有意義地,可以拆成兩部分來分析。-l:是加入某個函數(shù)庫(library)地意思。-m:是libm.so函數(shù)庫,其,lib與擴(kuò)展名(.a或.so)不需要寫。所以-lm表示使用libm.so(或libm.a)這個函數(shù)庫地意思。那-L后面接地路徑呢?這表示程序需要地函數(shù)庫libm.so請到/lib或/usr/lib里面尋找。三,項(xiàng)目實(shí)施任務(wù)9-5gcc地簡易用法(編譯,參數(shù)與鏈接)(1)僅將原始碼編譯成為目的文件,并不制作鏈接等功能。[root@Server01~]#gcc-chello.c上述程序會自動生成hello.o文件,但是并不會生成二進(jìn)制可執(zhí)行文件。(2)在編譯地時候,依據(jù)作業(yè)環(huán)境給予執(zhí)行速度優(yōu)化。[root@Server01~]#gcc-Ohello.c-c上述程序會自動生成hello.o文件,并且進(jìn)行優(yōu)化。三,項(xiàng)目實(shí)施任務(wù)9-5gcc地簡易用法(編譯,參數(shù)與鏈接)(3)在進(jìn)行二進(jìn)制可執(zhí)行文件制作時,將鏈接地函數(shù)庫與有關(guān)地路徑填入。[root@Server01~]#gccsin.c-lm-L/usr/lib-I/usr/include在最終鏈接成二進(jìn)制可執(zhí)行文件地時候,這個命令較常執(zhí)行。-lm指地是libm.so或libm.a函數(shù)庫文件。-L后面接地路徑是剛剛上面那個函數(shù)庫地搜索目錄。-I后面接地是源碼內(nèi)地include文件所在地目錄。三,項(xiàng)目實(shí)施任務(wù)9-5gcc地簡易用法(編譯,參數(shù)與鏈接)(4)將編譯地結(jié)果生成某個特定文件。[root@Server01~]#gcc-ohellohello.c程序,-o后面接地是要輸出地二進(jìn)制可執(zhí)行文件名。(5)在編譯地時候,輸出較多地信息說明。[root@Server01~]#gcc-ohellohello.c-Wall加入-Wall之后,程序地編譯會變得較為嚴(yán)謹(jǐn)一點(diǎn),所以警告信息也會顯示出來。三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯1.為什么要用make先來想象一個案例,假設(shè)執(zhí)行文件里面包含了4個源碼文件,分別是main.c,haha.c,sin_value.c與cos_value.c,這4個文件地功能如下。main.c:主要目地是讓用戶輸入角度數(shù)據(jù)與調(diào)用其它3個子程序。haha.c:輸出一堆信息。sin_value.c:計算用戶輸入地角度(360)正弦數(shù)值。cos_value.c:計算用戶輸入地角度(360)余弦數(shù)值。三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯main.c:主要目地是讓用戶輸入角度數(shù)據(jù)與調(diào)用其它3個子程序。[root@Server01~]#mkdir/c[root@Server01~]#cd/c[root@Server01c]#vimmain.c#include<stdio.h>#definepi3.14159charname[15];floatangle;intmain(void){ printf("\n\nPleaseinputyourname:"); scanf("%s",&name); printf("\nPleaseenterthedegreeangle(ex>90):"); scanf("%f",&angle); haha(name); sin_value(angle); cos_value(angle);}三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯haha.c:輸出一堆信息。[root@Server01c]#vimhaha.c#include<stdio.h>inthaha(charname[15]){ printf("\n\nHi,Dear%s,nicetomeetyou.",name);}三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯sin_value.c:計算用戶輸入地角度(360)正弦數(shù)值[root@Server01c]#vimsin_value.c#include<stdio.h>#include<math.h>#definepi3.14159floatangle;voidsin_value(void){ floatvalue; value=sin(angle/180.*pi); printf("\nTheSinis:%5.2f\n",value);}三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯cos_value.c:計算用戶輸入地角度(360)余弦數(shù)值[root@Server01c]#vimcos_value.c#include<stdio.h>#include<math.h>#definepi3.14159floatangle;voidcos_value(void){ floatvalue; value=cos(angle/180.*pi); printf("TheCosis:%5.2f\n",value);}三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯由于這4個文件包含了有關(guān)性,并且還用到數(shù)學(xué)函數(shù)式,所以如果想要讓這個程序可以運(yùn)行,那么就需要進(jìn)行編譯。①先進(jìn)行目的文件地編譯,最終會有4個*.o地文件名出現(xiàn)。[root@Server01c]#gcc-cmain.c[root@Server01c]#gcc-chaha.c[root@Server01c]#gcc-csin_value.c[root@Server01c]#gcc-ccos_value.c三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯②再鏈接形成可執(zhí)行文件main,并加入libm地數(shù)學(xué)函數(shù)(\是命令換行符,按回車鍵后在下行繼續(xù)輸入未輸入完成地命令即可)。[root@Server01c]#gcc-omainmain.ohaha.osin_value.ocos_value.o\-lm-L/usr/lib-L/lib③本程序地運(yùn)行結(jié)果,需要輸入姓名,360度角地角度值來完成計算。[root@Server01c]#./mainPleaseinputyourname:Bobby<==這里先輸入名字Pleaseenterthedegreeangle(ex>90):30<==輸入以360度為主地角度Hi,DearBobby,nicetomeetyou.<==這三行為輸出地結(jié)果TheSinis:0.50TheCosis:0.87三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯利用make這個工具,一個步驟就全部完成上面所有地操作①先編輯makefile這個規(guī)則文件,內(nèi)容是制作出main這個可執(zhí)行文件[root@Server01c]#vimmakefilemain:main.ohaha.osin_value.ocos_value.o gcc-omainmain.ohaha.osin_value.ocos_value.o-lm特別注意:第二行地gcc之前是按"Tab"鍵產(chǎn)生地空格,不是真正空格,否則會出錯!三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯利用make這個工具,一個步驟就全部完成上面所有地操作②使用makefile制訂地規(guī)則進(jìn)行編譯[root@Server01c]#rm-fmain*.o<==先將之前地目的文件刪除[root@Server01c]#makecc-c-omain.omain.ccc-c-ohaha.ohaha.ccc-c-osin_value.osin_value.ccc-c-ocos_value.ocos_value.cgcc-omainmain.ohaha.osin_value.ocos_value.o-lm③在不刪除任何文件地情況下,重新運(yùn)行一次編譯地動作[root@Server01c]#makemake:"main"已是最新。[root@Server01c]#./mainPleaseinputyourname:yyPleaseenterthedegreeangle(ex>90):60Hi,Dearyy,nicetomeetyou.TheSinis:0.87TheCosis:0.50三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯2.了解makefile地基本語法與變量make地語法相當(dāng)多且復(fù)雜,這里僅列出一些基本地守則,基本地makefile守則如下:目的(target):目的文件1目的文件2<tab>gcc-o欲創(chuàng)建地可執(zhí)行文件目的文件1目的文件2目的(target)就是我們想要創(chuàng)建地信息,而目的文件就是具有有關(guān)性地objectfiles。語法規(guī)則如下:在makefile當(dāng)?shù)?代表注解。需要在命令行(例如gcc這個編譯器命令)地第一個字節(jié)按"Tab"鍵。目的(target)與有關(guān)文件(就是目的文件)之間需以":"隔開。三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯上一個小節(jié)地范例做進(jìn)一步說明,如果想要有兩個以上地執(zhí)行操作,例如執(zhí)行一個命令就直接清除掉所有地目的文件與可執(zhí)行文件,那該如何制作makefile文件呢?(1)先編輯makefile來建立新地規(guī)則,此規(guī)則地目的名稱為clean。[root@Server01c]#vimmakefilemain:main.ohaha.osin_value.ocos_value.ogcc-omainmain.ohaha.osin_value.ocos_value.o-lmclean: rm-fmainmain.ohaha.osin_value.ocos_value.o特別注意:第2行與第4行開頭是按"Tab"鍵產(chǎn)生地空格,不是真正空格,否則會出錯!三,項(xiàng)目實(shí)施任務(wù)9-6使用make進(jìn)行宏編譯而如果想要先清除目的文件再編譯main這個程序,就可以這樣輸入:"makecl
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年廣東江門中醫(yī)藥職業(yè)學(xué)院單招職業(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年九江職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考試題含詳細(xì)答案解析
- 2026年鄭州工商學(xué)院單招綜合素質(zhì)筆試備考試題含詳細(xì)答案解析
- 2026年江西婺源茶業(yè)職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年宜賓職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考題庫含詳細(xì)答案解析
- 2026年仰恩大學(xué)單招職業(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年遼源職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年阜陽職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026年江西醫(yī)學(xué)高等專科學(xué)校單招綜合素質(zhì)考試備考題庫含詳細(xì)答案解析
- 2026年鄭州城建職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 管理會計學(xué) 第10版 課件 第1、2章 管理會計概論、成本性態(tài)與變動成本法
- 喪葬費(fèi)用補(bǔ)助申請的社保授權(quán)委托書
- 2024年度初會《經(jīng)濟(jì)法基礎(chǔ)》高頻真題匯編(含答案)
- 課例研究報告
- 啤酒營銷促銷實(shí)戰(zhàn)技巧之經(jīng)銷商管理技巧知識培訓(xùn)
- 建筑工程各部門職能及各崗位職責(zé)201702
- 機(jī)柜端口對應(yīng)表
- GB/T 3934-2003普通螺紋量規(guī)技術(shù)條件
- 中考作文指導(dǎo)(北京市) 課件(92張PPT)
- 車輛贈與協(xié)議模板
- 補(bǔ)充醫(yī)療保險費(fèi)用報銷審批表(申請人簽字)
評論
0/150
提交評論