版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目九使用gcc和make調(diào)試程序
1項(xiàng)目導(dǎo)入理解程序調(diào)試。掌握利用gcc進(jìn)行調(diào)試的方法。掌握使用make編譯的方法。職業(yè)能力目標(biāo)和要求程序?qū)懞昧耍酉聛?lái)做什么呢?調(diào)試!程序調(diào)試對(duì)于程序員或管理員來(lái)說(shuō)也是至關(guān)重要的一環(huán)。29.1
任務(wù)1了解程序的調(diào)試編程是一件復(fù)雜的工作,因?yàn)槭侨俗龅氖虑?,所以難免會(huì)出錯(cuò)。據(jù)說(shuō)有這樣一個(gè)典故:早期的計(jì)算機(jī)體積都很大,有一次一臺(tái)計(jì)算機(jī)不能正常工作,工程師們找了半天原因,最后發(fā)現(xiàn)是一只臭蟲(chóng)鉆進(jìn)計(jì)算機(jī)中造成的。從此以后,程序中的錯(cuò)誤被叫作臭蟲(chóng)(Bug),而找到這些Bug并加以糾正的過(guò)程就叫做調(diào)試(Debug)。有時(shí)候調(diào)試是一件非常復(fù)雜的工作,要求程序員概念明確、邏輯清晰、性格沉穩(wěn),還需要一點(diǎn)運(yùn)氣。調(diào)試的技能我們?cè)诤罄m(xù)的學(xué)習(xí)中慢慢培養(yǎng),但首先我們要區(qū)分清楚程序中的Bug分為哪幾類(lèi)。項(xiàng)目九使用gcc和make調(diào)試程序項(xiàng)目九使用gcc和make調(diào)試程序
編譯器只能翻譯語(yǔ)法正確的程序,否則將導(dǎo)致編譯失敗,無(wú)法生成可執(zhí)行文件。對(duì)于自然語(yǔ)言來(lái)說(shuō),一點(diǎn)語(yǔ)法錯(cuò)誤不是很?chē)?yán)重的問(wèn)題,因?yàn)槲覀內(nèi)匀豢梢宰x懂句子。而編譯器就沒(méi)那么寬容了,哪怕只有一個(gè)很小的語(yǔ)法錯(cuò)誤,編譯器就會(huì)輸出一條錯(cuò)誤提示信息然后罷工,你就得不到你想要的結(jié)果。雖然大部分情況下編譯器給出的錯(cuò)誤提示信息就是你出錯(cuò)的代碼行,但也有個(gè)別時(shí)候編譯器給出的錯(cuò)誤提示信息幫助不大,甚至?xí)`導(dǎo)你。在開(kāi)始學(xué)習(xí)編程的前幾個(gè)星期,你可能會(huì)花大量的時(shí)間來(lái)糾正語(yǔ)法錯(cuò)誤。等到有了一些經(jīng)驗(yàn)之后,還是會(huì)犯這樣的錯(cuò)誤,不過(guò)會(huì)少得多,而且你能更快地發(fā)現(xiàn)錯(cuò)誤原因。等到經(jīng)驗(yàn)更豐富之后你就會(huì)覺(jué)得,語(yǔ)法錯(cuò)誤是最簡(jiǎn)單最低級(jí)的錯(cuò)誤,編譯器的錯(cuò)誤提示也就那么幾種,即使錯(cuò)誤提示是有誤導(dǎo)的也能夠立刻找出真正的錯(cuò)誤原因是什么。相比下面兩種錯(cuò)誤,語(yǔ)法錯(cuò)誤解決起來(lái)要容易得多。9.1.1子任務(wù)1編譯時(shí)錯(cuò)誤39.1.2子任務(wù)2運(yùn)行時(shí)錯(cuò)誤
編譯器檢查不出這類(lèi)錯(cuò)誤,仍然可以生成可執(zhí)行文件,但在運(yùn)行時(shí)會(huì)出錯(cuò)而導(dǎo)致程序崩潰。對(duì)于我們接下來(lái)的幾章將編寫(xiě)的簡(jiǎn)單程序來(lái)說(shuō),運(yùn)行時(shí)錯(cuò)誤很少見(jiàn),到了后面的章節(jié)你會(huì)遇到越來(lái)越多的運(yùn)行時(shí)錯(cuò)誤。讀者在以后的學(xué)習(xí)中要時(shí)刻注意區(qū)分編譯時(shí)和運(yùn)行時(shí)(Run-time)這兩個(gè)概念,不僅在調(diào)試時(shí)需要區(qū)分這兩個(gè)概念,在學(xué)習(xí)C語(yǔ)言的很多語(yǔ)法時(shí)都需要區(qū)分這兩個(gè)概念,有些事情在編譯時(shí)做,有些事情則在運(yùn)行時(shí)做。4小資料通過(guò)本書(shū)你將掌握的最重要的技巧之一就是調(diào)試。。調(diào)試也像是一門(mén)實(shí)驗(yàn)科學(xué),
第三類(lèi)錯(cuò)誤是邏輯錯(cuò)誤和語(yǔ)義錯(cuò)誤。如果程序里有邏輯錯(cuò)誤,編譯和運(yùn)行都會(huì)很順利,看上去也不產(chǎn)生任何錯(cuò)誤信息,但是程序沒(méi)有干它該干的事情,而是干了別的事情。當(dāng)然不管怎么樣,計(jì)算機(jī)只會(huì)按你寫(xiě)的程序去做,問(wèn)題在于你寫(xiě)的程序不是你真正想要的。這意味著程序的意思(即語(yǔ)義)是錯(cuò)的。找到邏輯錯(cuò)誤在哪兒需要十分清醒的頭腦,要通過(guò)觀察程序的輸出回過(guò)頭來(lái)判斷它到底在做什么。9.1.3子任務(wù)3邏輯錯(cuò)誤和語(yǔ)義錯(cuò)誤5任務(wù)2使用傳統(tǒng)程序語(yǔ)言進(jìn)行編譯Linux操作系統(tǒng)作為一個(gè)免費(fèi)、自由、開(kāi)放的操作系統(tǒng),它擁有如下所述的一些特點(diǎn)。經(jīng)過(guò)上面的介紹之后,你應(yīng)該比較清楚地知道原始碼、編譯器、函數(shù)庫(kù)與運(yùn)行文件之間的相關(guān)性了。不過(guò),詳細(xì)的流程可能還不是很清楚,所以,在這里我們以一個(gè)簡(jiǎn)單的程序范例來(lái)說(shuō)明整個(gè)編譯的過(guò)程!趕緊進(jìn)入Linux系統(tǒng),實(shí)際操作一下下面的范例吧!6Linux系統(tǒng)下的交叉編譯基礎(chǔ)9.2.1子任務(wù)1安裝GCC1.認(rèn)識(shí)GCC
GCC(GNUCompilerCollection,GNU編譯器集合)是一套由GNU開(kāi)發(fā)的編程語(yǔ)言編譯器。它是一套GNU編譯器套裝。以GPL許可證所發(fā)行的自由軟件,也是GNU計(jì)劃的關(guān)鍵部分。GCC原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類(lèi)UNIX操作系統(tǒng)(如Linux、BSD、MacOSX等)采納為標(biāo)準(zhǔn)的編譯器。GCC同樣適用于微軟的Windows。GCC是自由軟件過(guò)程發(fā)展中的著名例子,由自由軟件基金會(huì)以GPL協(xié)議發(fā)布。
GCC原名為GNUC語(yǔ)言編譯器(GNUCCompiler),因?yàn)樗局荒芴幚鞢語(yǔ)言。但GCC后來(lái)得到擴(kuò)展,變得既可以處理C++,又可以處理Fortran、Pascal、Objective-C、Java,以及Ada與其他語(yǔ)言。。
72.安裝GCC
(1)檢查是否安裝GCC。[root@RHEL7-2~]#rpm-qa|grepgcccompat-libgcc-296-2.96-138libgcc-4.1.2-46.el5gcc-4.1.2-46.el5gcc-c++-4.1.2-46.el5上述結(jié)果表示已經(jīng)安裝了GCC。(2)如果系統(tǒng)還沒(méi)有安裝GCC軟件包,我們可以使用yum命令安裝所需軟件包。①掛載ISO安裝鏡像://掛載光盤(pán)到/iso下,前面項(xiàng)目3已建立/iso文件夾,并且yum源已經(jīng)配置好[root@RHEL7-2~]#mount/dev/cdrom/iso②制作用于安裝的yum源文件(后面不再贅述):8[root@RHEL7-2~]#vim/etc/yum.repos.d/dvd.repo#/etc/yum.repos.d/dvd.repo#orforONLYthemediarepo,dothis:#yum--disablerepo=\*--enablerepo=c6-media[command][dvd]name=dvdbaseurl=file:///isogpgcheck=0enabled=1③使用yum命令查看GCC軟件包的信息,如圖9-1所示。[root@RHEL7-2~]#yuminfogcc
92.LinuxShell
圖9-1使用yum命令查看gcc軟件包的信息10
④使用yum命令安裝GCC。[root@RHEL7-2~]#yumcleanall //安裝前先清除緩存[root@RHEL7-2~]#yuminstallgcc-y正常安裝完成后,最后的提示信息是:Installed:gcc.x86_640:4.8.5-16.el7DependencyInstalled:cpp.x86_640:4.8.5-16.el7glibc-devel.x86_640:2.17-196.el7glibc-headers.x86_640:2.17-196.el7kernel-headers.x86_640:3.10.0-693.el7libmpc.x86_640:1.0.1-3.el7Complete!所有軟件包安裝完畢之后,可以使用rpm命令再一次進(jìn)行查詢:rpm-qa|grepgcc。[root@RHEL7-2~]#rpm-qa|grepgcclibgcc-4.8.5-16.el7.x86_64gcc-4.8.5-16.el7.x86_6411129.2.2子任務(wù)2單一程序:打印HelloWorld
以Linux上面最常見(jiàn)的C語(yǔ)言來(lái)撰寫(xiě)第一個(gè)程序。第一個(gè)程序最常見(jiàn)的就是在屏幕上面打印“HelloWorld”。提示:請(qǐng)先確認(rèn)你的Linux系統(tǒng)里面已經(jīng)安裝了gcc。如果尚未安裝gcc,請(qǐng)使用RPM安裝,先安裝好GCC之后,再繼續(xù)下面的內(nèi)容。1.編輯程序代碼即源碼[root@RHEL7-2~]#vimhello.c<==用C語(yǔ)言寫(xiě)的程序擴(kuò)展名建議用.c#include<stdio.h>intmain(void){printf("HelloWorld\n");}上面是用C語(yǔ)言的語(yǔ)法寫(xiě)成的一個(gè)程序文件。第一行的那個(gè)“#”并不是注解。132.開(kāi)始編譯與測(cè)試運(yùn)行[root@RHEL7-2~]#gcchello.c[root@RHEL7-2~]#llhello.ca.out-rwxr-xr-x.1rootroot8512Jul1521:18a.out<==此時(shí)會(huì)生成這個(gè)文件名-rw-r--r--.1rootroot72Jul1521:17hello.c[root@RHEL7-2~]#./a.outHelloWorld<==成果出現(xiàn)了!在默認(rèn)的狀態(tài)下,如果我們直接以GCC編譯源碼,并且沒(méi)有加上任何參數(shù),則執(zhí)行文件的文件名會(huì)被自動(dòng)設(shè)置為a.out這個(gè)文件名。所以你就能夠直接執(zhí)行./a.out這個(gè)執(zhí)行文件。上面的例子很簡(jiǎn)單。那個(gè)hello.c就是源碼,而GCC就是編譯器,至于a.out就是編譯成功的可執(zhí)行文件。但如果想要生成目標(biāo)文件(objectfile)來(lái)進(jìn)行其他的操作,而且執(zhí)行文件的文件名也不要用默認(rèn)的a.out,那該如何做呢?其實(shí)你可以將上面的第2個(gè)步驟改成下面這樣:14[root@RHEL7-2~]#gcc-chello.c[root@RHEL7-2~]#llhello*-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o<==這就是生成的目標(biāo)文件[root@RHEL7-2~]#gcc-ohellohello.o[root@RHEL7-2~]#llhello*-rwxr-xr-x.1rootroot8512Jul1521:20hello<==這就是可執(zhí)行文件(-o的結(jié)果)-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o[root@RHEL7-2~]#./helloHelloWorld這個(gè)步驟主要是利用hello.o這個(gè)目標(biāo)文件生成一個(gè)名為hello的執(zhí)行文件,詳細(xì)的GCC語(yǔ)法我們會(huì)在后會(huì)繼續(xù)介紹。通過(guò)這個(gè)操作,我們可以得到hello及hello.o兩個(gè)文件,真正可以執(zhí)行的是hello這個(gè)二進(jìn)制文件(binaryprogram)(該源碼程序在出版社網(wǎng)站下載)。159.2.3子任務(wù)3主程序、子程序鏈接、子程序的編譯
如果我們?cè)谝粋€(gè)主程序里面又調(diào)用了另一個(gè)子程序呢?這是很常見(jiàn)的一個(gè)程序?qū)懛ǎ?/p>
因?yàn)榭梢院?jiǎn)化整個(gè)程序的易讀性。在下面的例子當(dāng)中,我們以thanks.c這個(gè)主程序去調(diào)用thanks_2.c這個(gè)子程序,寫(xiě)法很簡(jiǎn)單。1.撰寫(xiě)所需要的主程序、子程序[root@RHEL7-2~]#vimthanks.c#include<stdio.h>intmain(void){printf("HelloWorld\n");thanks_2();}上面的thanks_2()就是調(diào)用子程序![root@RHEL7-2~]#vimthanks_2.c#include<stdio.h>voidthanks_2(void){printf("Thankyou!\n");}162.進(jìn)行程序的編譯與鏈接(Link)(1)開(kāi)始將源碼編譯成為可執(zhí)行的binaryfile。[root@RHEL7-2~]#gcc-cthanks.cthanks_2.c[root@RHEL7-2~]#llthanks*-rw-r--r--.1rootroot76Jul1521:27thanks_2.c-rw-r--r--.1rootroot1504Jul1521:27thanks_2.o<==編譯生成的目標(biāo)文件!-rw-r--r--.1rootroot91Jul1521:25thanks.c-rw-r--r--.1rootroot1560Jul1521:27thanks.o<==編譯生成的目標(biāo)文件![root@RHEL7-2~]#gcc-othanksthanks.othanks_2.o[root@RHEL7-2~]#llthanks*-rwxr-xr-x.1rootroot8584Jul1521:28thanks<==最終結(jié)果會(huì)生成可執(zhí)行文件(2)執(zhí)行可執(zhí)行文件。[root@RHEL7-2~]#./thanksHelloWorldThankyou!179.2.4子任務(wù)4調(diào)用外部函數(shù)庫(kù):加入鏈接的函數(shù)庫(kù)剛剛我們都只是在屏幕上面打印出一些文字而已,如果要計(jì)算數(shù)學(xué)公式該怎么辦呢?例如我們想要計(jì)算出三角函數(shù)里面的sin(90°)。要注意的是,大多數(shù)的程序語(yǔ)言都是使用弧度而不是“角度”,180度等于3.14弧度。我們來(lái)寫(xiě)一個(gè)程序:[root@RHEL7-2~]#vimsin.c#include<stdio.h>intmain(void){floatvalue;value=sin(3.14/2);printf("%f\n",value);}那要如何編譯這個(gè)程序呢?我們先直接編譯:3需要時(shí)間不一樣掌握同樣學(xué)習(xí)材料不同學(xué)生[root@RHEL7-2~]#gccsin.csin.c:Infunction'main':sin.c:5:warning:incompatibleimplicitdeclarationofbuilt-infunction'sin'/tmp/ccsfvijY.o:Infunction`main':sin.c:(.text+0x1b):undefinedreferenceto`sin'collect2:ldreturned1exitstatus#注意看上面最后兩行,有個(gè)錯(cuò)誤信息,代表沒(méi)有成功怎么沒(méi)有編譯成功?它說(shuō)“undefinedreferencetosin”,意思是“沒(méi)有sin的相關(guān)定義參考值”,為什么會(huì)這樣呢?這是因?yàn)镃語(yǔ)言里面的sin函數(shù)是寫(xiě)在libm.so這個(gè)函數(shù)庫(kù)中,而我們并沒(méi)有在源碼里面將這個(gè)函數(shù)庫(kù)功能加進(jìn)去??梢赃@樣更正:編譯時(shí)加入額外函數(shù)庫(kù)鏈接的方式。4職業(yè)能力目標(biāo)和要求
特別注意,使用GCC編譯時(shí)所加入的那個(gè)-lm是有意義的,可以拆成兩部分來(lái)分析。-l:是加入某個(gè)函數(shù)庫(kù)(library)的意思。m:是libm.so函數(shù)庫(kù),其中,lib與擴(kuò)展名(.a或.so)不需要寫(xiě)。所以-lm表示使用libm.so(或libm.a)這個(gè)函數(shù)庫(kù)的意思。那-L后面接的路徑呢?這表示程序需要的函數(shù)庫(kù)libm.so請(qǐng)到/lib或/usr/lib里面尋找。注意:由于Linux默認(rèn)將函數(shù)庫(kù)放置在/lib與/usr/lib當(dāng)中,所以即便沒(méi)有寫(xiě)-L/lib與-L/usr/lib也沒(méi)有關(guān)系。不過(guò),萬(wàn)一哪天你使用的函數(shù)庫(kù)并非放置在這兩個(gè)目錄下,那么-L/path就很重要了,否則會(huì)找不到函數(shù)庫(kù)的。除了鏈接的函數(shù)庫(kù)之外,你或許已經(jīng)發(fā)現(xiàn)一個(gè)奇怪的地方,那就是sin.c中的第一行“#include<stdio.h>”,這行說(shuō)明的是要將一些定義數(shù)據(jù)由stdio.h這個(gè)文件讀入,這包括printf的相關(guān)設(shè)置。這個(gè)文件其實(shí)是放置在/usr/include/stdio.h的。那么萬(wàn)一這個(gè)文件并非放置在這里呢?那么我們就可以使用下面的方式來(lái)定義要讀取的include文件放置的目錄。[root@RHEL7-2~]#gccsin.c-lm-I/usr/include4-I/path后面接的路徑(Path)就是設(shè)置要去尋找相關(guān)的include文件的目錄。不過(guò),同樣,默認(rèn)值是放置在/usr/include下面,除非你的include文件放置在其他路徑,否則也可以略過(guò)這個(gè)選項(xiàng)。通過(guò)上面的幾個(gè)小范例,你應(yīng)該對(duì)于GCC以及源碼有了一定程度的認(rèn)識(shí)了,再接下來(lái),我們來(lái)整理一下GCC的簡(jiǎn)易使用方法。9.2.5子任務(wù)5GCC的簡(jiǎn)易用法(編譯、參數(shù)與鏈接)前面說(shuō)過(guò),GCC是Linux上面最標(biāo)準(zhǔn)的編譯器,這個(gè)GCC是由GNU計(jì)劃所維護(hù)的,有興趣的朋友請(qǐng)參考相關(guān)資料。既然GCC對(duì)于Linux上的Opensource這樣重要,那么下面我們就列舉幾個(gè)GCC常見(jiàn)的參數(shù)。(1)僅將原始碼編譯成為目標(biāo)文件,并不制作鏈接等功能。[root@RHEL7-2~]#gcc-chello.c上述程序會(huì)自動(dòng)生成hello.o這個(gè)文件,但是并不會(huì)生成binary執(zhí)行文件。(2)在編譯的時(shí)候,依據(jù)作業(yè)環(huán)境給予優(yōu)化執(zhí)行速度。[root@RHEL7-2~]#gcc-Ohello.c-c上述程序會(huì)自動(dòng)生成hello.o這個(gè)文件,并且進(jìn)行優(yōu)化。(3)在進(jìn)行binaryfile制作時(shí),將鏈接的函數(shù)庫(kù)與相關(guān)的路徑填入。[root@RHEL7-2~]#gccsin.c-lm-L/usr/lib-I/usr/include5l在最終鏈接成binaryfile的時(shí)候,這個(gè)命令較常執(zhí)行。l-lm指的是libm.so或libm.a這個(gè)函數(shù)庫(kù)文件。l-L后面接的路徑是剛剛上面那個(gè)函數(shù)庫(kù)的搜索目錄。l-I后面接的是源碼內(nèi)的include文件的所在目錄。(4)將編譯的結(jié)果生成某個(gè)特定文件。[root@RHEL7-2~]#gcc-ohellohello.c程序中,-o后面接的是要輸出的binaryfile文件名(5)在編譯的時(shí)候,輸出較多的信息說(shuō)明。[root@RHEL7-2~]#gcc-ohellohello.c-Wall加入-Wall之后,程序的編譯會(huì)變得較為嚴(yán)謹(jǐn)一點(diǎn),所以警告信息也會(huì)顯示出來(lái)。我們通常稱-Wall或者-O這些非必要的參數(shù)為標(biāo)志(FLAGS)。因?yàn)槲覀兪褂玫氖荂程序語(yǔ)言,所以有時(shí)候也會(huì)簡(jiǎn)稱這些標(biāo)志為CFLAGS。這些變量偶爾會(huì)被使用,尤其會(huì)在后面介紹的make相關(guān)用法中被使用。任務(wù)3使用make進(jìn)行宏編譯69.3.1子任務(wù)1為什么要用make先來(lái)想像一個(gè)案例,假設(shè)我的執(zhí)行文件里面包含了4個(gè)源碼文件,分別是main.c、haha.c、sin_value.c和cos_value.c這4個(gè)文件,這4個(gè)文件的功能如下所示。lmain.c:主要的目的是讓用戶輸入角度數(shù)據(jù)與調(diào)用其他3個(gè)子程序。lhaha.c:輸出一堆信息。lsin_value.c:計(jì)算用戶輸入的角度(360)正弦數(shù)值。lcos_value.c:計(jì)算用戶輸入的角度(360)余弦數(shù)值。提示:這4個(gè)文件可在出版社的網(wǎng)站上下載,或通過(guò)QQ(68433059)聯(lián)系作者索要。[root@rhel7-2c]#catmain.c#include<stdio.h>7#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);}[root@rhel7-2c]#cathaha.c#include<stdio.h>inthaha(charname[15]){ printf("\n\nHi,Dear%s,nicetomeetyou.",name);}24[root@rhel7-2c]#catsin_value.c#include<stdio.h>#definepi3.14159floatangle;voidsin_value(void){ floatvalue; value=sin(angle/180.*pi); printf("\nTheSinis:%5.2f\n",value);}[root@rhel7-2c]#catcos_value.c#include<stdio.h>#definepi3.14159floatangle;voidcos_value(void){ floatvalue; value=cos(angle/180.*pi); printf("TheCosis:%5.2f\n",value);}
由于這4個(gè)文件里面包含了相關(guān)性,并且還用到數(shù)學(xué)函數(shù)式,所以如果想要讓這個(gè)程序可以運(yùn)行,那么就需要進(jìn)行編譯。25①先進(jìn)行目標(biāo)文件的編譯,最終會(huì)有4個(gè)*.o的文件名出現(xiàn)。[root@RHEL7-2~]#gcc-cmain.c[root@RHEL7-2~]#gcc-chaha.c[root@RHEL7-2~]#gcc-csin_value.c[root@RHEL7-2~]#gcc-ccos_value.c②再鏈接形成可執(zhí)行文件main,并加入libm的數(shù)學(xué)函數(shù),以生成main可執(zhí)行文件。[root@RHEL7-2~]#gcc-omainmain.ohaha.osin_value.ocos_value.o\-lm-L/usr/lib-L/lib③本程序的運(yùn)行結(jié)果,必須輸入姓名、360度角的角度值來(lái)計(jì)算。[root@RHEL7-2~]#./mainPleaseinputyourname:Bobby<==這里先輸入名字Pleaseenterthedegreeangle(ex>90):30<==輸入以360度角為主的角度Hi,DearBobby,nicetomeetyou.<==這三行為輸出的結(jié)果TheSinis:0.50TheCosis:0.8726編譯的過(guò)程需要進(jìn)行好多操作,而且如果要重新編譯,則上述的流程需要重新重復(fù)一遍,光是找出這些命令就夠煩人的了。如果可以的話,能不能一個(gè)步驟就全部完成上面所有的操作呢?那就是利用make這個(gè)工具。先試著在這個(gè)目錄下創(chuàng)建一個(gè)名為makefile的文件,代碼如下。#先編輯makefile這個(gè)規(guī)則文件,內(nèi)容是制作出main這個(gè)可執(zhí)行文件[root@RHEL7-2~]#vimmakefilemain:main.ohaha.osin_value.ocos_value.o gcc-omainmain.ohaha.osin_value.ocos_value.o-lm特別注意:第二行的gcc之前是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則出錯(cuò)。#.嘗試使用makefile制訂的規(guī)則進(jìn)行編譯[root@RHEL7-2~]#rm-fmain*.o<==先將之前的目標(biāo)文件刪除[root@RHEL7-2~]#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此時(shí)make會(huì)去讀取makefile的內(nèi)容,并根據(jù)內(nèi)容直接去編譯相關(guān)的文件,警告信息可忽略。27#在不刪除任何文件的情況下,重新運(yùn)行一次編譯的動(dòng)作[root@RHEL7-2~]#makemake:`main'isuptodate.看到了吧!是否很方便呢?!只進(jìn)行了更新(update)的操作。[root@rhel7-2c]#./mainPleaseinputyourname:yyPleaseenterthedegreeangle(ex>90):60Hi,Dearyy,nicetomeetyou.TheSinis:0.87TheCosis:0.509.3.2子任務(wù)2了解makefile的基本語(yǔ)法與變量28make的語(yǔ)法可是相當(dāng)多而復(fù)雜的,有興趣的話可以到GNU去查閱相關(guān)的說(shuō)明。這里僅列出一些基本的守則,重點(diǎn)在于讓讀者們未來(lái)在接觸原始碼時(shí)不會(huì)太緊張!好了,基本的makefile守則是這樣的:目標(biāo)(target):目標(biāo)文件1目標(biāo)文件2<tab>gcc-o欲創(chuàng)建的可執(zhí)行文件
目標(biāo)文件1目標(biāo)文件2目標(biāo)(target)就是我們想要?jiǎng)?chuàng)建的信息,而目標(biāo)文件就是具有相關(guān)性的objectfiles,那創(chuàng)建可執(zhí)行文件的語(yǔ)法就是以按“Tab”鍵開(kāi)頭的那一行,要特別留意,命令列必須要以按“Tab”鍵作為開(kāi)頭才行。語(yǔ)法規(guī)則如下。l在makefile當(dāng)中的#代表注解。
l需要在命令行(例如gcc這個(gè)編譯器命令)的第一個(gè)字節(jié)按“Tab”鍵。
目標(biāo)(target)與相關(guān)文件(就是目標(biāo)文件)之間需以“:”隔開(kāi)。同樣的,我們以上一個(gè)小節(jié)的范例做進(jìn)一步說(shuō)明,如果想要有兩個(gè)以上的執(zhí)行操作,例如執(zhí)行一個(gè)命令就直接清除掉所有的目標(biāo)文件與可執(zhí)行文件,那該如何制作makefile文件呢?29(1)先編輯makefile來(lái)建立新的規(guī)則,此規(guī)則的目標(biāo)名稱為clean。[root@RHEL7-2~]#vimmakefilemain:main.ohaha.osin_value.ocos_value.ogcc-omainmain.ohaha.osin_value.ocos_value.o-lmclean:rm-fmainmain.ohaha.osin_value.ocos_value.o特別注意:第二行和第四開(kāi)頭是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則出錯(cuò)?。。?)以新的目標(biāo)(clean)測(cè)試,看看執(zhí)行make的結(jié)果。[root@RHEL7-2~]#makeclean<==就是這里!通過(guò)make以clean為目標(biāo)rm-rfmainmain.ohaha.osin_value.ocos_value.o如此一來(lái),我們的makefile里面就具有至少兩個(gè)目標(biāo),分別是main與clean,如果我們想要?jiǎng)?chuàng)建main的話,輸入“makemain”;如果想要清除信息,輸入“makeclean”即可。而如果想要先清除目標(biāo)文件再編譯main這個(gè)程序,就可以這樣輸入:“make
clean
main”,如下所示:30[root@RHEL7-2~]#makecleanmainrm-rfmainmain.ohaha.osin_value.ocos_value.occ-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不過(guò),makefile里面重復(fù)的數(shù)據(jù)還是有點(diǎn)多。我們可以再通過(guò)shell
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物流倉(cāng)儲(chǔ)合同
- 2024年跨國(guó)商品銷(xiāo)售合同及其附件
- 二零二五版酒店式公寓租賃合同(含家政服務(wù))下載3篇
- 第三人民醫(yī)院肉類(lèi)配送服務(wù)合同(含冷鏈運(yùn)輸及質(zhì)量控制)二零二五年度3篇
- 2025年度智慧城市建設(shè)承包協(xié)議模板3篇
- 2025版五星酒店廚師長(zhǎng)職位競(jìng)聘與聘用合同3篇
- 2025年度旅游景區(qū)場(chǎng)地承包使用權(quán)合同3篇
- 2025年度林業(yè)土地經(jīng)營(yíng)權(quán)入股合同范本4篇
- 高校二零二五年度科研項(xiàng)目管理聘用合同3篇
- 2024年:知識(shí)產(chǎn)權(quán)保護(hù)合同2篇
- 第22單元(二次函數(shù))-單元測(cè)試卷(2)-2024-2025學(xué)年數(shù)學(xué)人教版九年級(jí)上冊(cè)(含答案解析)
- 安全常識(shí)課件
- 河北省石家莊市2023-2024學(xué)年高一上學(xué)期期末聯(lián)考化學(xué)試題(含答案)
- 小王子-英文原版
- 新版中國(guó)食物成分表
- 2024年山東省青島市中考生物試題(含答案)
- 河道綜合治理工程技術(shù)投標(biāo)文件
- 專題24 短文填空 選詞填空 2024年中考英語(yǔ)真題分類(lèi)匯編
- 再生障礙性貧血課件
- 產(chǎn)后抑郁癥的護(hù)理查房
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論