第七章多模块软件的编译和链接

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

多模块软件的编译和链接第7章预习检查$make–f文件,是什么文件?遵循makefile语法的文件,也就是makefile文件目标列表:关联性列表,含义是什么?目标列表依赖于关联性列表简单变量的定义方式?变量名:=文本举一个make内置变量的例CFLAGS,$@,$?等makeclean,clean常见的含义是什么?clean是虚目标,删除make生成的文件2本章目标了解Make实用程序的功能使用makefile管理多模块软件掌握makefile的规则,变量掌握makefile的虚目标规则本章结构简介多模块软件的编译和链接Makefile和MakeRules默认规则虚目标特殊目标一般性语法错误及其纠正措施多模块软件、依赖树和makeMake实用程序make实用程序对简单变量的支持内建变量命令行的使用和调试1-1多模块软件实用的软件都是拥有多个源文件这些源文件称之为模块多模块软件多模块软件优点缺点较小的程序文件易于维护知道所有文件的依赖性只需编译经过修改的源文件,而不是编译整个系统跟踪所有文件修改的时间戳支持信息隐藏必须键入很长的命令行2-1make一个差强人意的办法使用shell脚本上述的缺点,导致了make的产生。$catbuild.scgcc–cprog1.cprog2.cprog3.cgcc–oprogprog1.oprog2.oprog3.o2-1makeMake的产生Make程序最初来源于steveJohnson的一个拜访,那天他风风火火的闯进我的办公室,诅咒命运之神让他浪费了一个早上来调试一个正确的程序(bug修改了,但是没有编译,因此cc*.o无效)。而我也花了前一个晚上的部分时间在我参与的项目中解决同样的灾难,这样编写一个工具来解决这个问题的想法诞生了。最开始是精细的依赖关系分析器,浓缩为更简单的东西后,周末就出炉了make.新兴工具的使用也是unix文化的一部分。Make文件都是文本的,不是神秘的二进制编码,因为就是unix的精神:可打印,可调试,可理解。----stuartFeldman2-1make管理多模块程序的编译和连接读取一个说明文件---Makefile描述系统中各模块的依赖关系make使重编译的次数达到最小化Makefile描述的依赖关系各组件文件的时间戳Makefile实质上是一种脚本语言2-1Make语法make[选项][目标][宏定义]目的Make程序更新文件是基于存放在一个文件中的依赖关系,称为Makefile。2-1makefile目标列表:关联性列表Tab命令列表目标列表:关联性列表;命令列表也称为先决条件2-1makefile注释#连接符\关联列表和命令列表中使用shell通配符?*[…]与shell脚本的相同2-1makefile实例源码power.c#includemath.h#includestdio.hmain(){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.cgccpower.c-opower–lm$制表符Tab2-2依赖树把power.c分成两个文件#includestdio.hdoublecompute(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));}#includemath.hdoublecompute(doublex,doubley){return(pow((double)x,(double)y));}2-2依赖树power.ocompute.opower:power.ocompute.ogccpower.ocompute.o-opower-lm2-2依赖树power.ocompute.opower:power.ocompute.ogccpower.ocompute.o-opower-lmpower.o:power.cgcc–cpower.ccompute.o:compute.cgcc–ccompute.cpower.ccompute.c$makegcc-cpower.cgcc-ccompute.cgccpower.ocompute.o-opower—lm树中节点的处理是自底向上的,由叶结点的父节点开始2-2makefile当目标文件比关联文件更新更新关联文件,对比$touchpower.C$makegccpower.c–opower–lm仅仅只更新文件的修改时间为当前时间目标文件存在,且比关联文件更新重新编译更新的关联文件2-2依赖树进一步分成六个文件,建立依赖树$catcompute.c#includemath.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);2-2依赖树$catmain.c#includestdio.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));}2-2依赖树$catmain.c#includestdio.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));}2-2依赖树$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.第一个先决条件不存在,或者先决条件作为目标文件的先决条件更新。生成第一个2.当所有的先决条件更新后,生成最终目标文件2-3默认模式规则-默认的后缀规则SUFFIXES:.o.c.s.c.o:$(CC)$(CFLAGS)-c$.s.o:$(AS)$(ASFLAGS)-o$@$-默认的模式规则(gnuMake)%.o:%.c:$(CC)$(CFLAGS)-c$%.o:%.s$(AS)$(ASFLAGS)-o$@$-利用默认的规则修改后的makefile$catmakefilepower:main.oinput.ocompute.ogccmain.oinput.ocompute.o-opower-lmmain.o:main.hinput.hcompute.hinput.o:input.hcompute.o:compute.h内置变量,以后会经常遇到阶段总结为什么使用make?Makefile的语法规则依赖树的分析默认的模式规则2-4简单变量简单变量定义:变量名:=[文本]添加:变量名+=[文本]引用$(变量名)${变量名}$单字符变量C=gcc$C见过其他的模式吗?变量名=[文本]变量名?=[文本]超出了本章的范围2-4简单变量$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$2-5内置变量变量名意义$@当前目标的名称$?比当前目标更新的已修改的依赖性列表$比当前目标更新的已修改的依赖性名称$^用空格分开的所有依赖性列表2-5修改后的makefilecomplete: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虚目标2-6虚目标$catmakefileINSTALLDIR=/home/sarwar/courses/bininstall:clientservercp–f$^$(INSTALLDIR)rm–f*.o$^cd$(INSTALLDIR);chmod755$^uninstall:cd$(INSTALLDIR);rmclientserverclient:client.omiscc.orcopyc.ogccclient.omiscc.orcopyc.o–lnsl-oclient\client.o:cl

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功