




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
申嵌
培训讲座—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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路养护合同范本
- 人力资源外包合同范例
- 代理旗舰店合同范本
- 农户种植水稻合同范本
- 2024年中国移动招聘考试真题
- 个人债权抵押合同范本
- 2024年西安工业大学专任教师招聘考试真题
- 企业签订劳务合同范本
- 供热站拆除合同范本
- 兼职技术总工合同范本
- 《反窃电技术》课件
- 1.1原子结构-12课时课件高二化学人教版选择性必修2
- 如何让孩子积极参与家务劳动
- 2023年污水处理行业洞察报告及未来五至十年预测分析报告(修订版)
- 小学生素质发展报告单
- 人卫版急诊与灾难医学之呼吸困难教学课件
- 厨房油烟净化设备日常保养与维护
- 拓扑数据分析理论
- (完整版)200210号文-工程勘察设计收费标准(2002年修订本)
- 部编版语文二年级上册第1单元核心素养教案
- (完整版)污水管道施工方案
评论
0/150
提交评论