申嵌視頻exynos442-基礎(chǔ)篇第六講make與makefile_第1頁
申嵌視頻exynos442-基礎(chǔ)篇第六講make與makefile_第2頁
申嵌視頻exynos442-基礎(chǔ)篇第六講make與makefile_第3頁
申嵌視頻exynos442-基礎(chǔ)篇第六講make與makefile_第4頁
申嵌視頻exynos442-基礎(chǔ)篇第六講make與makefile_第5頁
免費預(yù)覽已結(jié)束,剩余34頁可下載查看

付費下載

下載本文檔

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

文檔簡介

申嵌

培訓(xùn)講座—Exynos

4412基礎(chǔ)篇家園-開發(fā)板商城/主辦:承辦:協(xié)辦:申嵌信息科技家園家園-開發(fā)板商城廣州友善之臂計算機科技主講:賀工第六講內(nèi)容回顧GCC編譯方式GDB的使用家園-開發(fā)板商城

/第六講Make與Makefile主講:賀工家園-開發(fā)板商城

/預(yù)習(xí)檢查$make–f

文件,是什么文件?遵循Makefile語法的文件,也就是Makefile文件目標列表:關(guān)聯(lián)性列表,含義是什么?目標列表依賴于關(guān)聯(lián)性列表簡單變量的定義方式?變量名:=文本列舉一個make內(nèi)置變量的例子$@,$?等make

clean,clean常見的含義是什么?clean是虛目標,刪除make生成的文件4家園-開發(fā)板商城/本章目標了解Make實用程序的功能使用Makefile管理多模塊掌握Makefile的規(guī)則,變量掌握Makefile的虛目標規(guī)則應(yīng)用Makefile管理多個源文件的工程家園-開發(fā)板商城/本章結(jié)構(gòu)簡介Make和MakefileMakefile和Make

Rules多模塊

、依賴樹和makeMake實用程序默認規(guī)則make實用程序?qū)唵巫兞康闹С謨?nèi)建變量虛目標特殊目標一般性語法錯誤及其糾正措施命令行的使用和調(diào)試家園-開發(fā)板商城/1-1

多模塊實用的 都是擁有多個源文件這些源文件稱之為模塊多模塊多模塊優(yōu)點缺點較小的程序文件易于知道所有文件的依賴性只需編譯經(jīng)過修改的源文件,而不是編譯整個系統(tǒng)所有文件修改的時間戳支持信息隱藏必須鍵入很長 令行家園-開發(fā)板商城/2-1make一個差強人意的辦法使用s上述的缺點,導(dǎo)致了make的產(chǎn)生。$cat

build.scgcc

–c

prog1.c

prog2.c

prog3.cgcc

–o

prog

prog1.o

prog2.o

prog3.o家園-開發(fā)板商城/2-1

make,直至生成可make用來管理多模塊程序的編譯和執(zhí)行代碼。通過 一個說明文件---Makefile描述系統(tǒng)中各模塊的依賴關(guān)系各模塊的編譯規(guī)則make使用Makefile使重編譯的次數(shù)達到最小化Makefile描述的依賴關(guān)系說明各組件文件的時間戳(修改時間)Makefile

實質(zhì)上是一種 語言家園-開發(fā)板商城/2-1make語法make[選項][目標][宏定義]執(zhí)行執(zhí)行make命令時,只需在Makefile文件所在的

輸入make指令即可。家園-開發(fā)板商城/2-1make常用選項特性-d顯示調(diào)試信息-f<文件>指定從哪個文件中 依賴關(guān)系信息。默認文件是”Makefile”或“makefile”“-”表示從標準輸入-h顯示所有Makefile的help信息-n打印所有Makefile執(zhí)行命令,但事實上不執(zhí)行這些命令-s運行時不顯示任何信息家園-開發(fā)板商城/2-1Makefile目標列表:關(guān)聯(lián)性列表<Tab>命令列表也稱為先決條件家園-開發(fā)板商城/2-1Makefile注釋#連接符\關(guān)聯(lián)列表和命令列表中使用s

通配符?*與s

腳本的相同家園-開發(fā)板商城/2-1Makefilescanf(“%f”,&y實例源碼-power.c#include

<math.h>int

main(){ffllooaatt

xx,,yy;;nn””));;printf(“enteprintf(“x^y

is

%6.3f\n”,pow((d

uble)x,(double)y));rreettuurrnn

00;;}}a

TABrprintf(“x^y

irs

%6.3f\gnc”cy,:p”o)w;p(o(wer.c

-o

power

–lmy)$;$cat

Makefilepprriinnttff((““tthhee

ppr#oSgarmapm#leSammapkleetfaiklmeeakfeofriltexhe

power

programprintf(“enteran#dfoRrfermoemthmsebtedirnp:oweeraancpdhrogcroammdimsapnladyslixn^ey.s\tarr#ts

with

a

TABssccaannff((““%%ff””,,&&xnupmobweeRre:mpeomwberx.:c”);:each

command

line

starts

withg ower.c

-o

power–lmscanf(“%f”,&x)$;power:power.c制表符<Tab>家園-開發(fā)板商城/2-1Makefile當(dāng)目標文件比關(guān)聯(lián)文件更新更新關(guān)聯(lián)文件,對比$touch

power.c$makegower.c

–o

power

–lm僅僅只更新文件的修改時間為當(dāng)前時間目標文件存在,且比關(guān)聯(lián)文件更新重新編譯更新的關(guān)聯(lián)文件家園-開發(fā)板商城/2-2依賴樹把power.c分成兩個文件#cat

power.c#include

<stdio.h>double

compute(double

x,double

y);int

main(){}},嵌入式家園-開發(fā)板商城

/

#cat

compute.c##iinncclluuddee

<<mmaatthh..hh>>float

x,y;

ddoouubbllee

ccoommppuuttee((ddoouubbllee

xx,,ddoouubbllee

yy))pprriinntfft

((””TThhee

{program

takes

x

from

stdin

and

displays

x^y.

\\nn””));;pprriinnttff((””EEnntter

rreettuurrnn((ppooww((((ddoouubbllee))xxn,um(bdeorubxl:e)”y)););ssccaannff((””%%ff,(d}ouble)y));

pprriinnttff((””EEnn,t

&x)};

scanf(”%f,ter

number

y:”);printf(”x^,y

&y);return

0;

is:%6.3f\n”,

compute(x,y));2-2依賴樹power.ocompute.ogopower:power.o

compute.ogowweerr..oo

ccoommppuuttee..oo

--oo

ppoowweerr

--llmm家園-開發(fā)板商城/2-2依賴樹power.ocompute.opower:power.o

compute.ogg

oowweerr..oo

ccoommppuuttee..oo

--oo

ppoowweerr

--llmmpower.o:power.cpower.ccompute.cp—lm$makeggcccc

–c

powgecrc.cg-ccc

p-ocwepro.werc.cppuuteg.ccgccc-c-ccocmopmuptute.cggcccc

––cc

ccomgogcoowecro.mpoutceo.mpout-eo.poow-eor

p—owlemr樹點的處理是自底向上的,由葉結(jié)點的節(jié)點開始家園-開發(fā)板商城//em/http:/$cat

compute.c#include

<math.h>#include

”compute.h”ddoouubbllee

ccoommppuuttee((ddoouubbllee

xx,,ddoouubbllee

yy)){{rreettuurrnn((ppooww((((ddoouubbllee))

(double)y));-}開發(fā)板商城家);}園,2-2依賴樹進一步分成六個文件,建立依賴樹$cat

main.h//**DDeeccllaarraattiioonn

ooff

pprroommppttss

ttoo

uusseerrss

**//ccoonnsstt

cchhaarr

**PPRROOMMPPTTll==””EEnntteerr

tthhee

vvaalluuee

ooffxx::””ccoonnsstt

cchhaarr

**PPRROOMMPPTT22==””EEnntteerr

tthhee

vvaalluuee

ooff

yy::””$$ccaatt

iinnppuutt..cc#include

<stdio.h>#include

”input.h”double

input(const

char

*s){ffllooaatt

xx;;printf(”%s”,s);scanf(“%f”,&x);return(x);}$$ccaatt

iinnppuutt..hh/*

Declaration

of

the”input”function*/double

input(const

char*);$$

ccaatt

ccoommppuuttee..hh/*

Declaration

of

the“compute”function*/double

compute(double,double);2-2依賴樹$$ccaatt

mmaaiinn..cc

##iinncclluuddee

<<ssttddiioo..hh>>

##iinncclluuddee

””mmaaiinn..hh””

##iinncclluuddee

””ccoommppuuttee..hh””

#include

”input.h”iinntt

mmaaiinn(()){ddoouubbllee

xx,,yy;;printf(”The

program

takes

X

and

Y

from

stdin

anddisplays

x^y.\n”);xx==iinnppuutt((PPRROOMMPPTTll));;yy==iinnppuutt((PPRROOMMPPTT22));;pprriinnttff((””xx^^yy

iiss::%%66..33ff\\nn””,,ccoommppuuttee((xx,,yy))));;rreettuurrnn

00;;}}家園-開發(fā)板商城/2-2依賴樹oo::ggcccc

--cc

iinnppuutt..cc

ppuuttee..cc

ccoommppuuttee..hhgcc-ccompute.c$$$

mmaakkeegcc

-c

main.cggcccc

--cc

iinnppuutt..cc

gcc

-c

compute.cgcc

main.o

input.o

compute.o-o

power

-1m$$

ccaatt

MMaakkefefiilleepower:main.o

input.o

compute.ogcc

main.o

input.o

compute.o

-o

power

-1mmmaaiinn.oo::mmaaiinn..cc

mmaaiinn..hh

iinnppuutt..hh

ccoommppuutte..e

hhggcccc

--cc

mmaaiinn..ccinput.o:input.c

input.h家園-開發(fā)板商城/2-3默認模式規(guī)則%.o:%.s--利利用用默默認認的的規(guī)規(guī)則則修修改改后后的的MMaakkeeffiillee$cat

Makefile$(AS)$(ASFLAGS)

-o

$@

$<ppoowweerr:m:maaiinn..oo

iinnppuutt..oo

ccoommppuuteet

..oogcc

main.o

input.o

compute.o

-o

power

-lmmmaaiinn..oo:m:maaiinn..hh

iinnppuutt..hh

ccoommpputtu

ee.hh.

iinnpuup

tt.o::o.input.hccoommpputtu

ee.o:c:o.

coommpuup

tte..e

hh--默默認認的的模模式式規(guī)規(guī)則則((GGNNUU

MMaakkee

內(nèi)置變量,以后會經(jīng)常遇到%.o:%.c:$(CC)$(CFLAGS)-c

$<家園-開發(fā)板商城/2-4簡單變量簡單變量定義:變量名:=[文本]添加:變量名+=[文本]$(變量名)${變量名}$單字符變量C=gcc$CCC=gcc$(CC)見過其他的模式嗎?變量名=[文本]變量名?=[文本]超出了本章的范圍家園-開發(fā)板商城

/2-4簡單變量$cat

MakefileCC

:=

gccOPTIONS:=-O3OBJECTS:=main.oOBJECTS+=input.ocompute.oSOURCES:=main.c

input.c

compute.cHEADERS:=main.h

input.h

compute.hpower:$(OBJECTS)$(CC)

$(OPTIONS)

$(OBJECTS)

-o

power

-lmmain.o:main.h

input.h

compute.hinput.o:input.h

compute.o:compute.htar:Makefile

$(HEADERS)

$(SOURCES)tar

-cvf

power.tar

Makefile

$(HEADERS)

$(SOURCES)clean:rm

*.o$家園-開發(fā)板商城/2-5

內(nèi)置變量變量名意義$@當(dāng)前目標的名稱(代表目標列表)$?比當(dāng)前目標更新的已修改的依賴性列表(代表所有已修改的依賴文件)$<比當(dāng)前目標更新的已修改的當(dāng)前依賴性名稱(代表第一個依賴文件)$^用空格分開的所有依賴性列表家園-開發(fā)板商城/@echo

”Build

complete”ppoowweerr::$$((OOBBJJEECCTTSS))$$((CCCC))$$((OOPPTTIIOONNSS))--OO

$$@@

$$^^

--llmm@@eecchhoo

””TThhee

eexxeeccuuttaabbllee

iiss

iinn

tthhee

ppoowweerr

ffiillee..””2-5修改后的Makefileo:main.o:main.h

input.h

compute.hpute.hiinnppuutt..oo::iinnppuutt..hhppoowweerr..ttaarr::MMaakkeeffiillee

$$((HHEEAADDEERRSS))

$$((SSOOUURRCCEESS))

ttaarr

--ccvvff

$$@@

$$^^.PHONY:cleancclleeaan::nrrmm

--ff

**..oo

ppoowweerr家園-開發(fā)板商城ao.c虛目標2-6虛目標Makefile中有一些目標,它們是一些不存在的文件,而且也無需創(chuàng)建它們,這些目標成為虛目標。允許你強制執(zhí)行某些事件,而這些事件在正常規(guī)則中是不會發(fā)生的。虛目標總是使與之有關(guān) 令被執(zhí)行。比如:可以通過設(shè)置一個虛目標生成多個可執(zhí)行文件,如果不使用虛目標,make就只能建立第一個目標。家園-開發(fā)板商城/2-6虛目標常見虛目標列表目標意義all生成工程中所有可以執(zhí)行者,通常是Makefile的第一個生成目標clean刪除make

all生成的所有文件install在系統(tǒng) 中安裝工程項目生成的可執(zhí)行文件和文檔uninstall刪除make

install

安裝的所有文件家園-開發(fā)板商城/2-6虛目標家園....-開發(fā)板商城/$cat

MakefileIINNSSTTAALLLLDDIIRR==//hhoommee//eemmbbeeddcclluubb//bbiinniinnssttaallll::cclliieenntt

sseerrvveerrcp

–f

$^

$(INSTALLDIR)rrmm

––ff

**..oo

$$^^cd

$(INSTALLDIR);

od

755

$^uninstall:ccdd

$$((IINNSSTTAALLLLDDIIRR));;rrmm

cclliieenntt

sseerrvveerr

client:client.o

miscc.o

rcopyc.oggcccc

ccliil

eenntt.oo.

mmiisscccc..oo

rrccooppyycc..oo

––llnnssll

--oo

cclliieenntt

\\

client.o:client.c

netc.h

rcopy.hgcc

-c

client.c$$mmaakkee

iinnssttaallll.

.1.不存在的文件,僅為完成某些功能2現(xiàn).如什果么下?存在這個同名文件會出2-7特殊目標上述問題用.PHONY的特殊目標解決.PHONY:cleanclean:rm

–rf

*.o家園-開發(fā)板商城/2-8一般性語法錯誤錯誤一:缺少Tab鍵錯誤二:在連接符’\’和換行符之間 了空格$$mmaakkeeMMaakkeeffiillee::44::******mmiissssiinngg

sseeppaarraattoorr..SSttoopp$cat–t

Makefile//顯示Makefile中制表符為^I$cat–e

Makefile//將Makefile中的換行符顯示為$輸出$$ggrreepp

‘‘\\\\[[]]$$’’MMaakkeeffiillee

////顯顯示示MMaakkeeffiillee中中不不正正確確的的行行////注注意意[[]]中中間間指指定定幾幾個個空空格格,,那那么么就就只只能能查查到到對對應(yīng)應(yīng)的的錯錯誤誤,,即即\\與與換換行行符符中中

了了幾幾個個空空格格的的錯錯誤誤。。家園-開發(fā)板商城/2-9命令行的使用和調(diào)試使用非標準的Makefile名稱文件從標準輸入顯示Makefile中所執(zhí)行命令的順序$

make

-fprog1.makefile$make

-f

-$make

-n家園-開發(fā)板商城/2-10

制作工程文件的Makefile一般工程文件proc由以下部分組成:src:

main.c

fun1.c

fun2.c…include:

fun1.h

fun2.h…test/Makefile$$ccaatt

..//MMaakkeeffiilleeVVPPAATTHH

==

ssrrcc::iinncclluuddee

all:test4

tar.PHONY:alltest4:main.o

fun1.o

fun2.ogcc

main.o

fun1.o

fun2.o

-o

test4mmaaiinn..oo::mmaaiinn..ccgcc

-c

-Iinclude

-o

$@

$^fun1.o:fun2.o:tar:ttaarr

ccvvff

tteesstt44..ttaarr

ssrrcc

iinncclluuddee

MMaakkeeffiillee.PHONY:cleanclean:家園-開發(fā)板r商m城*.ortmes*t.4o2-10

制作工程文件的Makefile$cat

./src/main.c#include

<stdio.h>##iinncclluuddee

""....//iinncclluuddee//ffuunn11..hh""

##iinncclluudde

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論