Linux基礎(chǔ)之多模塊編譯和鏈接_第1頁(yè)
Linux基礎(chǔ)之多模塊編譯和鏈接_第2頁(yè)
Linux基礎(chǔ)之多模塊編譯和鏈接_第3頁(yè)
Linux基礎(chǔ)之多模塊編譯和鏈接_第4頁(yè)
Linux基礎(chǔ)之多模塊編譯和鏈接_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

講師:楊行系列課程—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)下的開(kāi)發(fā)環(huán)境Gcc,Gdb課程安排第一天

上午:Linux系統(tǒng)簡(jiǎn)介和安裝下午: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天)課前提問(wèn)Make–f文件,是什么文件

?目標(biāo)類表:關(guān)聯(lián)性列表含義是什么?如何定義簡(jiǎn)單變量?舉一個(gè)make內(nèi)置變量的例子本章目標(biāo)Make實(shí)用程序的功能使用makefile管理多模塊軟件makefile的規(guī)則,變量makefile的虛目標(biāo)規(guī)則Makefile常見(jiàn)錯(cuò)誤和調(diào)試實(shí)用的軟件都是擁有多個(gè)源文件這些源文件稱之為模塊多模塊軟件多模塊軟件優(yōu)點(diǎn)缺點(diǎn)較小的程序文件易于維護(hù)知道所有文件的依賴性只需編譯經(jīng)過(guò)修改的源文件,而不是編譯整個(gè)系統(tǒng)跟蹤所有文件修改的時(shí)間戳支持信息隱藏必須鍵入很長(zhǎng)的命令行知識(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)更新過(guò)的文件而減少編譯的工作量,同時(shí),它通過(guò)讀入Makefile文件文件的內(nèi)容來(lái)執(zhí)行大量的編譯工作Make將只編譯改動(dòng)的代碼文件,而不用完全編譯。Make管理多模塊程序的編譯和連接讀取一個(gè)說(shuō)明文件---Makefile描述系統(tǒng)中各模塊的依賴關(guān)系make使重編譯的次數(shù)達(dá)到最小化Makefile描述的依賴關(guān)系各組件文件的時(shí)間戳Makefile實(shí)質(zhì)上是一種腳本語(yǔ)言Make語(yǔ)法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)的簡(jiǎn)要說(shuō)明-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文件-依賴樹(shù)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樹(shù)中節(jié)點(diǎn)的處理是自底向上的,由葉結(jié)點(diǎn)的父節(jié)點(diǎn)開(kāi)始Makefile文件-依賴樹(shù)當(dāng)目標(biāo)文件比關(guān)聯(lián)文件更新更新關(guān)聯(lián)文件,對(duì)比$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è)文件,建立依賴樹(shù)$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文件-依賴樹(shù)$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文件-依賴樹(shù)$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文件-依賴樹(shù)-默認(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)建變量的目的:用來(lái)代替一個(gè)文本字符串:1.系列文件的名字

2.傳遞給編譯器的參數(shù)

3.需要運(yùn)行的程序

4.需要查找源代碼的目錄

5.你需要輸出信息的目錄

6.你想做的其它事情。簡(jiǎn)單變量定義:變量名:=[文本]添加:變量名+=[文本]引用$(變量名)${變量名}$單字符變量C=gcc$CMakefile的規(guī)則和變量變量定義的兩種方式遞歸展開(kāi)方式VAR=var簡(jiǎn)單方式VAR:=var變量使用$(VAR)用”$”則用”$$”來(lái)表示剛才的例子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ī)則和變量-簡(jiǎn)單變量實(shí)例變量名意義$@當(dāng)前目標(biāo)的名稱$?比當(dāng)前目標(biāo)更新的已修改的依賴性列表$<比當(dāng)前目標(biāo)更新的已修改的依賴性名稱$^用空格分開(kāi)的所有依賴性列表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)體、依賴文件及其之間的命令語(yǔ)句

隱式規(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ī)則和變量常見(jiàn)隱式規(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ī)則是用來(lái)定義相同處理規(guī)則的多個(gè)文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來(lái)進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個(gè)文件建立相同的規(guī)則,從而簡(jiǎn)化了Makefile的編寫(xiě)模式規(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ī)則和變量不存在的文件,而且也無(wú)需創(chuàng)建他們?cè)试S你強(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)常見(jiàn)虛目標(biāo)列表目標(biāo)意義all生成工程中所以可以執(zhí)行者,通常是makefile的第一個(gè)生成目標(biāo)test運(yùn)行程序的自動(dòng)測(cè)試套件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)上述問(wèn)題用.PHONY的特殊目標(biāo)解決.PHONY:cleanclean:

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論