申嵌视频exynos442-基础篇第六讲make与makefile_第1页
申嵌视频exynos442-基础篇第六讲make与makefile_第2页
申嵌视频exynos442-基础篇第六讲make与makefile_第3页
申嵌视频exynos442-基础篇第六讲make与makefile_第4页
申嵌视频exynos442-基础篇第六讲make与makefile_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

申嵌

培训讲座—Exynos

4412基础篇家园-开发板商城/主办:承办:协办:申嵌信息科技家园家园-开发板商城广州友善之臂计算机科技主讲:贺工第六讲内容回顾GCC编译方式GDB的使用家园-开发板商城

/第六讲Make与Makefile主讲:贺工家园-开发板商城

/预习检查$make–f

文件,是什么文件?遵循Makefile语法的文件,也就是Makefile文件目标列表:关联性列表,含义是什么?目标列表依赖于关联性列表简单变量的定义方式?变量名:=文本列举一个make内置变量的例子$@,$?等make

clean,clean常见的含义是什么?clean是虚目标,删除make生成的文件4家园-开发板商城/本章目标了解Make实用程序的功能使用Makefile管理多模块掌握Makefile的规则,变量掌握Makefile的虚目标规则应用Makefile管理多个源文件的工程家园-开发板商城/本章结构简介Make和MakefileMakefile和Make

Rules多模块

、依赖树和makeMake实用程序默认规则make实用程序对简单变量的支持内建变量虚目标特殊目标一般性语法错误及其纠正措施命令行的使用和调试家园-开发板商城/1-1

多模块实用的 都是拥有多个源文件这些源文件称之为模块多模块多模块优点缺点较小的程序文件易于知道所有文件的依赖性只需编译经过修改的源文件,而不是编译整个系统所有文件修改的时间戳支持信息隐藏必须键入很长 令行家园-开发板商城/2-1make一个差强人意的办法使用s上述的缺点,导致了make的产生。$cat

build.scgcc

–c

prog1.c

prog2.c

prog3.cgcc

–o

prog

prog1.o

prog2.o

prog3.o家园-开发板商城/2-1

make,直至生成可make用来管理多模块程序的编译和执行代码。通过 一个说明文件---Makefile描述系统中各模块的依赖关系各模块的编译规则make使用Makefile使重编译的次数达到最小化Makefile描述的依赖关系说明各组件文件的时间戳(修改时间)Makefile

实质上是一种 语言家园-开发板商城/2-1make语法make[选项][目标][宏定义]执行执行make命令时,只需在Makefile文件所在的

输入make指令即可。家园-开发板商城/2-1make常用选项特性-d显示调试信息-f<文件>指定从哪个文件中 依赖关系信息。默认文件是”Makefile”或“makefile”“-”表示从标准输入-h显示所有Makefile的help信息-n打印所有Makefile执行命令,但事实上不执行这些命令-s运行时不显示任何信息家园-开发板商城/2-1Makefile目标列表:关联性列表<Tab>命令列表也称为先决条件家园-开发板商城/2-1Makefile注释#连接符\关联列表和命令列表中使用s

通配符?*与s

脚本的相同家园-开发板商城/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>家园-开发板商城/2-1Makefile当目标文件比关联文件更新更新关联文件,对比$touch

power.c$makegower.c

–o

power

–lm仅仅只更新文件的修改时间为当前时间目标文件存在,且比关联文件更新重新编译更新的关联文件家园-开发板商城/2-2依赖树把power.c分成两个文件#cat

power.c#include

<stdio.h>double

compute(double

x,double

y);int

main(){}},嵌入式家园-开发板商城

/

#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家园-开发板商城/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树点的处理是自底向上的,由叶结点的节点开始家园-开发板商城//em/http:/$cat

compute.c#include

<math.h>#include

”compute.h”ddoouubbllee

ccoommppuuttee((ddoouubbllee

xx,,ddoouubbllee

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

(double)y));-}开发板商城家);}园,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;;}}家园-开发板商城/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家园-开发板商城/2-3默认模式规则%.o:%.s--利利用用默默认认的的规规则则修修改改后后的的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--默默认认的的模模式式规规则则((GGNNUU

MMaakkee

内置变量,以后会经常遇到%.o:%.c:$(CC)$(CFLAGS)-c

$<家园-开发板商城/2-4简单变量简单变量定义:变量名:=[文本]添加:变量名+=[文本]$(变量名)${变量名}$单字符变量C=gcc$CCC=gcc$(CC)见过其他的模式吗?变量名=[文本]变量名?=[文本]超出了本章的范围家园-开发板商城

/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$家园-开发板商城/2-5

内置变量变量名意义$@当前目标的名称(代表目标列表)$?比当前目标更新的已修改的依赖性列表(代表所有已修改的依赖文件)$<比当前目标更新的已修改的当前依赖性名称(代表第一个依赖文件)$^用空格分开的所有依赖性列表家园-开发板商城/@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家园-开发板商城ao.c虚目标2-6虚目标Makefile中有一些目标,它们是一些不存在的文件,而且也无需创建它们,这些目标成为虚目标。允许你强制执行某些事件,而这些事件在正常规则中是不会发生的。虚目标总是使与之有关 令被执行。比如:可以通过设置一个虚目标生成多个可执行文件,如果不使用虚目标,make就只能建立第一个目标。家园-开发板商城/2-6虚目标常见虚目标列表目标意义all生成工程中所有可以执行者,通常是Makefile的第一个生成目标clean删除make

all生成的所有文件install在系统 中安装工程项目生成的可执行文件和文档uninstall删除make

install

安装的所有文件家园-开发板商城/2-6虚目标家园....-开发板商城/$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现.如什果么下?存在这个同名文件会出2-7特殊目标上述问题用.PHONY的特殊目标解决.PHONY:cleanclean:rm

–rf

*.o家园-开发板商城/2-8一般性语法错误错误一:缺少Tab键错误二:在连接符’\’和换行符之间 了空格$$mmaakkeeMMaakkeeffiillee::44::******mmiissssiinngg

sseeppaarraattoorr..SSttoopp$cat–t

Makefile//显示Makefile中制表符为^I$cat–e

Makefile//将Makefile中的换行符显示为$输出$$ggrreepp

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

////显显示示MMaakkeeffiillee中中不不正正确确的的行行////注注意意[[]]中中间间指指定定几几个个空空格格,,那那么么就就只只能能查查到到对对应应的的错错误误,,即即\\与与换换行行符符中中

了了几几个个空空格格的的错错误误。。家园-开发板商城/2-9命令行的使用和调试使用非标准的Makefile名称文件从标准输入显示Makefile中所执行命令的顺序$

make

-fprog1.makefile$make

-f

-$make

-n家园-开发板商城/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:家园-开发板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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论