版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
講師:楊行系列課程—Linux基礎(chǔ)多模塊編譯和鏈接第七章課程目標(biāo)具備搭建linux系統(tǒng)平臺(tái)能力系統(tǒng)安裝具備Linux系統(tǒng)日常維護(hù)能力文件,目錄結(jié)構(gòu)linux的常用命令,ViShell腳本編程、管道及其重定向tftp,nfs服務(wù)器的配置熟悉Linux系統(tǒng)下的開發(fā)環(huán)境Gcc,Gdb課程安排第一天
上午:Linux系統(tǒng)簡介和安裝下午:Linux安裝實(shí)際演練第二天
上午:Linux基本操作命令下午:Linux基本操作命令實(shí)戰(zhàn)第三天上午:Linux進(jìn)程操作
下午:Linux服務(wù)器配置第四天
上午:Linux腳本編程上下午:Linux腳本編程下第五天
上午:源代碼編譯和調(diào)試下午:多模塊軟件的編譯和鏈接(預(yù)科內(nèi)容,根據(jù)實(shí)際情況調(diào)整授課天數(shù),4-10天)課前提問Make–f文件,是什么文件
?目標(biāo)類表:關(guān)聯(lián)性列表含義是什么?如何定義簡單變量?舉一個(gè)make內(nèi)置變量的例子本章目標(biāo)Make實(shí)用程序的功能使用makefile管理多模塊軟件makefile的規(guī)則,變量makefile的虛目標(biāo)規(guī)則Makefile常見錯(cuò)誤和調(diào)試實(shí)用的軟件都是擁有多個(gè)源文件這些源文件稱之為模塊多模塊軟件多模塊軟件優(yōu)點(diǎn)缺點(diǎn)較小的程序文件易于維護(hù)知道所有文件的依賴性只需編譯經(jīng)過修改的源文件,而不是編譯整個(gè)系統(tǒng)跟蹤所有文件修改的時(shí)間戳支持信息隱藏必須鍵入很長的命令行知識(shí)點(diǎn)1-Make一個(gè)差強(qiáng)人意的辦法使用shell腳本上述的缺點(diǎn),導(dǎo)致了make的產(chǎn)生。$catbuild.scgcc–cprog1.cprog2.cprog3.cgcc–oprogprog1.oprog2.oprog3.oMake工程管理器,顧名思義,是指管理較多的文件Make工程管理器也就是個(gè)“自動(dòng)編譯管理器”,這里的“自動(dòng)”是指它能構(gòu)根據(jù)文件時(shí)間戳自動(dòng)發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時(shí),它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作Make將只編譯改動(dòng)的代碼文件,而不用完全編譯。Make管理多模塊程序的編譯和連接讀取一個(gè)說明文件---Makefile描述系統(tǒng)中各模塊的依賴關(guān)系make使重編譯的次數(shù)達(dá)到最小化Makefile描述的依賴關(guān)系各組件文件的時(shí)間戳Makefile實(shí)質(zhì)上是一種腳本語言Make語法make[選項(xiàng)]
[目標(biāo)]
[宏定義]
目的Make程序更新文件是基于存放在一個(gè)文件中的依賴關(guān)系,稱為Makefile。Make常用選項(xiàng)特性-d顯示調(diào)試信息-f<文件>指定從哪個(gè)文件中讀取依賴關(guān)系信息。默認(rèn)文件是”Makefile”或“makefile”“-”表示從標(biāo)準(zhǔn)輸入-h顯示所有選項(xiàng)的簡要說明-n不運(yùn)行任何Makefile命令,只顯示他們-s安靜的方式運(yùn)行,不顯示任何信息Make知識(shí)點(diǎn)2—Makefile文件Makefile是Make讀入的唯一配置文件由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件要?jiǎng)?chuàng)建的目標(biāo)體所依賴的文件(dependency_file)創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command)注意:命令行前面必須是一個(gè)”TAB鍵”,否則編譯錯(cuò)誤為:***missingseparator.Stop.目標(biāo)列表:關(guān)聯(lián)性列表
<Tab>命令列表目標(biāo)列表:關(guān)聯(lián)性列表;命令列表也稱為先決條件Makefile文件Makefile格式1target:dependency_files<TAB>command例子hello.o:hello.chello.h gcc–chello.c–ohello.oMakefile格式2target:dependency_files;command例子hello.o:hello.chello.h;gcc–chello.c–ohello.o注釋#連接符\關(guān)聯(lián)列表和命令列表中使用shell通配符?*[…]與shell腳本的相同Makefile文件實(shí)例源碼power.c#include<math.h>#include<stdio.h>Voidmain(){floatx,y;printf("theprogramtakexandfromstdinanddisplaysx^y.\n");printf("enternumberx:");scanf("%f",&x);printf("enternumbery:");scanf("%f",&y);printf("x^yis%6.3f\n",pow((double)x,(double)y));}$catMakefile#Samplemakefileforthepowerprogram#Remember:eachcommandlinestartswithaTABpower:power.c gccpower.c-opower–lm$制表符<Tab>Makefile文件把power.c分成兩個(gè)文件#include<stdio.h>doublecompute(doublex,doubley);main(){floatx,y;printf("theprogramtakexandfromstdinanddisplaysx^y.\n");printf("enternumberx:");scanf("%f",&x);printf("enternumbery:");scanf("%f",&y);printf("x^yis%6.3f\n",compute(x,y));}#include<math.h>doublecompute(doublex,doubley){return(pow((double)x,(double)y));}Makefile文件power.ocompute.opower:power.ocompute.o gccpower.ocompute.o-opower-lmMakefile文件-依賴樹power.ocompute.opower:power.ocompute.o gccpower.ocompute.o-opower-lmpower.o:power.c gcc–cpower.ccompute.o:compute.c gcc–ccompute.cpower.ccompute.c$makegcc-cpower.cgcc-ccompute.cgccpower.ocompute.o-opower—lm樹中節(jié)點(diǎn)的處理是自底向上的,由葉結(jié)點(diǎn)的父節(jié)點(diǎn)開始Makefile文件-依賴樹當(dāng)目標(biāo)文件比關(guān)聯(lián)文件更新更新關(guān)聯(lián)文件,對比$makemake:’power’isuptodate$touchpower.C$makegccpower.c–opower–lm僅僅只更新文件的修改時(shí)間為當(dāng)前時(shí)間目標(biāo)文件存在,且比關(guān)聯(lián)文件更新重新編譯更新的關(guān)聯(lián)文件Makefile文件進(jìn)一步分成六個(gè)文件,建立依賴樹$catcompute.c#include<math.h>#include”compute.h”doublecompute(doublex,doubley){return(pow((double)x,(double)y));}$catmain.h/*Declarationofpromptstousers*/constchar*PROMPTl=”Enterthevalueofx:”;constchar*PROMPT2=”Enterthevalueofy:”;$catinput.C#include”input.h”doubleinput(constchar*s){floatx;printf(”%s”,s);scanf(“%f”,&x);return(x);}$catinput.h/*Declarationofthe”input”function*/doubleinput(char*);catcompute.h/*Declarationofthe“compute”function*/doublecompute(double,double);Makefile文件-依賴樹$catmain.c#include<stdio.h>#include”main.h”#include”compute.h”#include”input.h”main(){doublex,y;printf(”TheprogramtakesXandYfromstdinanddisplaysx^y.\n”);x=input(PROMPTl);y=input(PROMPT2);printf(”x^yis:%6.3f\n”,compute(x,y));}Makefile文件-依賴樹$catmakefilepower:main.oinput.ocompute.ogccmain.oinput.ocompute.o-opower-1mmain.o:main.cmain.hinput.hcompute.hgcc-cmain.cinput.o:input.cinput.hgcc-cinput.ccompute.o:compute.ccompute.hgcc-ccompute.c$$makegcc-cmain.cgcc-cinput.cgcc-ccompute.cgccmain.oinput.ocompute.o-opower-1m1.第一個(gè)先決條件不存在,或者先決條件作為目標(biāo)文件的先決條件更新。生成第一個(gè)2.當(dāng)所有的先決條件更新后,生成最終目標(biāo)文件Makefile文件-依賴樹-默認(rèn)的后綴規(guī)則SUFFIXES:.o.c.s.c.o: $(CC)$(CFLAGS)-c$<.s.o: $(AS)$(ASFLAGS)-o$@$<-默認(rèn)的模式規(guī)則(gnuMake)%.o:%.c: $(CC)$(CFLAGS)-c$<%.o:%.s $(AS)$(ASFLAGS)-o$@$<-利用默認(rèn)的規(guī)則修改后的makefile$catmakefilepower:main.oinput.ocompute.o gccmain.oinput.ocompute.o-opower-lmmain.o:main.hinput.hcompute.hinput.o:input.hcompute.o:compute.h內(nèi)置變量,以后會(huì)經(jīng)常遇到知識(shí)點(diǎn)3-Makefile的規(guī)則和變量Makefile的規(guī)則和變量一個(gè)復(fù)雜一些的例子sunq:kang.oyul.o gcckang.obar.o-omyprogkang.o:kang.ckang.hhead.h gcc–Wall–O-g–ckang.c-okang.oyul.o:bar.chead.h gcc-Wall–O-g–cyul.c-oyul.o注釋:-Wall:表示允許發(fā)出gcc所有有用的報(bào)警信息.-c:只是編譯不鏈接,生成目標(biāo)文件”.so”-ofile:表示把輸出文件輸出到file里Makefile的規(guī)則和變量創(chuàng)建變量的目的:用來代替一個(gè)文本字符串:1.系列文件的名字
2.傳遞給編譯器的參數(shù)
3.需要運(yùn)行的程序
4.需要查找源代碼的目錄
5.你需要輸出信息的目錄
6.你想做的其它事情。簡單變量定義:變量名:=[文本]添加:變量名+=[文本]引用$(變量名)${變量名}$單字符變量C=gcc$CMakefile的規(guī)則和變量變量定義的兩種方式遞歸展開方式VAR=var簡單方式VAR:=var變量使用$(VAR)用”$”則用”$$”來表示剛才的例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$(OBJS)-osunqkang.o:kang.ckang.h $(CC)$(CFLAGS)-ckang.c-okang.oyul.o:yul.cyul.h $(CC)$(CFLAGS)-cyul.c-oyul.oMakefile的規(guī)則和變量$catmakefileCC:=gccOPTIONS:=-O3OBJECTS
:=main.oOBJECTS
+=
input.ocompute.oSOURCES:=main.cinput.ccompute.cHEADERS:=main.hinput.hcompute.hpower:$(OBJECTS)$(CC)$(OPTIONS)-opower
$(OBJECTS)-lmmain.o:main.hinput.hcompute.hinput.o:input.hcompute.o:compute.hpower.tar:makefile$(HEADERS)$(SOURCES)tar-cvfpower.tarmakefile$(HEADERS)$(SOURCES)clean:rm–rf*.o$Makefile的規(guī)則和變量-簡單變量實(shí)例變量名意義$@當(dāng)前目標(biāo)的名稱$?比當(dāng)前目標(biāo)更新的已修改的依賴性列表$<比當(dāng)前目標(biāo)更新的已修改的依賴性名稱$^用空格分開的所有依賴性列表Makefile的規(guī)則和變量-內(nèi)置變量complete:power@echo”Buildcomplete”power:$(OBJECTS) $(CC)$(OPTIONS)-O$@$^-lm@echo”Theexecutableisinthepowerfile.”main.o:main.hinput.hcompute.hcompute.o:compute.hinput.o:input.hpower.tar:makefile$(HEADERS)$(SOURCES) tar-cvf$@$^clean: rm-rf*.ocorepower虛目標(biāo)Makefile的規(guī)則和變量Make進(jìn)行處理的依據(jù)包括目標(biāo)體、依賴文件及其之間的命令語句
隱式規(guī)則模式規(guī)則Makefile的規(guī)則和變量隱式規(guī)則隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的技術(shù)完成任務(wù),這樣,當(dāng)用戶使用它們時(shí)就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需把目標(biāo)文件列出即可例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$^-o$@Makefile的規(guī)則和變量AR歸檔維護(hù)程序的名稱,默認(rèn)值為ar。
ARFLAGS歸檔維護(hù)程序的選項(xiàng)。
AS匯編程序的名稱,默認(rèn)值為as。
ASFLAGS匯編程序的選項(xiàng)。
CC
C編譯器的名稱,默認(rèn)值為cc。
CFLAGS
C編譯器的選項(xiàng)。
CPP
C預(yù)編譯器的名稱,默認(rèn)值為$(CC)-E。
CPPFLAGS
C預(yù)編譯的選項(xiàng)。
CXX
C++編譯器的名稱,默認(rèn)值為g++。
CXXFLAGS
C++編譯器的選項(xiàng)。
FC
FORTRAN編譯器的名稱,默認(rèn)值為f77。
FFLAGS
FORTRAN編譯器的選項(xiàng)。Makefile的規(guī)則和變量常見隱式規(guī)則目錄C編譯:.c變?yōu)?o $(CC)–c$(CPPFLAGS)$(CFLAGS)C++編譯:.cc或.C變?yōu)?o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pascal編譯:.p變?yōu)?o$(PC)-c$(PFLAGS)Fortran編譯:.r變?yōu)?o$(FC)-c$(FFLAGS)。Makefile的規(guī)則和變量模式規(guī)則模式規(guī)則是用來定義相同處理規(guī)則的多個(gè)文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個(gè)文件建立相同的規(guī)則,從而簡化了Makefile的編寫模式規(guī)則的格式類似于普通規(guī)則,這個(gè)規(guī)則中的相關(guān)文件前必須用“%”標(biāo)明Makefile的規(guī)則和變量模式規(guī)則下OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gsunq:$(OBJS) $(CC)$^-o$@%.o:%.c $(CC)$(CFLAGS)-c$<-o$@Makefile的規(guī)則和變量例子2(main.cmain.h)OBJ=main.ohello:$(OBJ)$(CC)$^-o$@%.o:%c$(CC)-c$<-o$@clean:$(RM)helloMakefile的規(guī)則和變量不存在的文件,而且也無需創(chuàng)建他們允許你強(qiáng)制執(zhí)行某些事件,而這些事件在正常規(guī)則中是不會(huì)發(fā)生的規(guī)則虛目標(biāo)和先決條件如果虛目標(biāo)作為先決條件使用,它必須作為目標(biāo)出現(xiàn)在某處虛目標(biāo)總是使與之有關(guān)的命令被執(zhí)行虛目標(biāo)作為先決條件,總是相應(yīng)的目標(biāo)重建知識(shí)點(diǎn)4-Makefile的虛目標(biāo)常見虛目標(biāo)列表目標(biāo)意義all生成工程中所以可以執(zhí)行者,通常是makefile的第一個(gè)生成目標(biāo)test運(yùn)行程序的自動(dòng)測試套件clean刪除makeall生成的所有文件install在系統(tǒng)目錄中安裝工程項(xiàng)目生成的可執(zhí)行文件和文檔uninstall刪除makeinstall安裝的所有文件Makefile的虛目標(biāo)$catmakefileINSTALLDIR=/home/sarwar/courses/bininstall:clientserver cp–f$^$(INSTALLDIR) rm–f*.o$^ cd$(INSTALLDIR);chmod755$^uninstall:
cd$(INSTALLDIR);rmclientserver client:client.omiscc.orcopyc.o gccclient.omiscc.orcopyc.o–lnsl-oclient\ client.o:etc.hrcopy.h gcc-cclient.c$makeinstall.......不存在的文件,僅為完成某些功能Makefile的虛目標(biāo)上述問題用.PHONY的特殊目標(biāo)解決.PHONY:cleanclean:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 夫妻保證書全文樣本
- 農(nóng)業(yè)用地流轉(zhuǎn)承包協(xié)議書
- 成人教育宣傳推廣協(xié)議
- 冷熱水管材購銷合同范本
- 光纖采購招標(biāo)合同履行問題處理建議
- 員工外出安全保護(hù)方案
- 月嫂服務(wù)合同貼心解讀
- 項(xiàng)目服務(wù)合同范本分享
- 供應(yīng)商合同樣本
- 工程安裝委托書格式樣本
- 產(chǎn)品研發(fā)合伙人合作協(xié)議書
- 2024年化學(xué)檢驗(yàn)員(中級(jí)工)技能鑒定考試題庫(附答案)
- 【MOOC】中學(xué)化學(xué)教學(xué)設(shè)計(jì)與實(shí)踐-北京師范大學(xué) 中國大學(xué)慕課MOOC答案
- 山東師范大學(xué)《學(xué)術(shù)研究與論文寫作》2021-2022學(xué)年第一學(xué)期期末試卷
- 2023-2024學(xué)年廣東省深圳市寶安區(qū)五年級(jí)(上)期末英語試卷
- 2024年度VR虛擬現(xiàn)實(shí)內(nèi)容創(chuàng)作合同
- 幼兒園社會(huì)教育專題-形考任務(wù)二-國開(FJ)-參考資料
- 第五單元有趣的立體圖形 (單元測試)-2024-2025學(xué)年一年級(jí)上冊數(shù)學(xué) 北師大版
- 設(shè)備基礎(chǔ)(土建)施工方案
- 部編 2024版歷史七年級(jí)上冊期末(全冊)復(fù)習(xí)卷(后附答案及解析)
- 陶藝課程課件
評論
0/150
提交評論