资源预览内容
第1页 / 共44页
第2页 / 共44页
第3页 / 共44页
第4页 / 共44页
第5页 / 共44页
第6页 / 共44页
第7页 / 共44页
第8页 / 共44页
第9页 / 共44页
第10页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
多模块软件的编译和链接第7章预习检查v$make f 文件,是什么文件? 遵循makefile语法的文件,也就是makefile文件 v目标列表: 关联性列表,含义是什么?目标列表依赖于关联性列表 v简单变量的定义方式? 变量名 := 文本 v举一个make内置变量的例 CFLAGS, $,$?等 vmake clean,clean常见的含义是什么? clean是虚目标,删除make生成的文件2本章目标v了解Make实用程序的功能v使用makefile管理多模块软件v掌握makefile的规则,变量v掌握makefile的虚目标规则v了解autoconf的原理和用法本章结构简介多模块软件的编译和链接Makefile和Make Rules默认规则虚目标特殊目标一般性语法错误及其纠正措施autoconf多模块软件、依赖树和makeMake实用程序make实用程序对简单变量的支持内建变量命令行的使用和调试1-1 多模块软件v实用的软件都是拥有多个源文件n这些源文件称之为模块n多模块软件 v多模块软件优点缺点较小的程序文件易于维护知道所有文件的依赖性只需编译经过修改的源文件,而不 是编译整个系统跟踪所有文件修改的时间戳支持信息隐藏必须键入很长的命令行2-1make v一个差强人意的办法n使用shell脚本v上述的缺点,导致了make的产生。$cat build.scgcc c prog1.c prog2.c prog3.cgcc o prog prog1.o prog2.o prog3.o2-1makevMake的产生Make 程序最初来源于steve Johnson的一个拜访,那天他风风火 火的闯进我的办公室,诅咒命运之神让他浪费了一个早上来调试 一个正确的程序(bug修改了,但是没有编译,因此cc *.o无效) 。而我也花了前一个晚上的部分时间在我参与的项目中解决同样 的灾难,这样编写一个工具来解决这个问题的想法诞生了。最开 始是精细的依赖关系分析器,浓缩为更简单的东西后,周末就出 炉了make.新兴工具的使用也是unix文化的一部分。Make文件都是 文本的,不是神秘的二进制编码,因为就是unix的精神:可打印, 可调试,可理解。-stuart Feldman2-1makev管理多模块程序的编译和连接v读取一个说明文件-makefilen描述系统中各模块的依赖关系vMake使重编译的次数达到最小化nMakefile描述的依赖关系n各组件文件的时间戳vMakefile 实质上是一种脚本语言2-1Make语法Make 选项 目标 宏定义 目的Make程序更新文件是基于存放在一个文件中的依赖关系 ,称为Makefile。2-1make常用选项特性 -d显示调试信息 -f 指定从哪个文件中读取依赖关系信息。 默认文件是”Makefile” 或 “makefile” “-” 表示从标准输入 -h显示所有选项的简要说明 -n不运行任何Makefile命令,只显示他们 -s安静的方式运行,不显示任何信息2-1makefile目标列表: 关联性列表命令列表目标列表: 关联性列表; 命令列表也称为先决条件2-1makefilev注释 n# v连接符n v关联列表和命令列表中使用shell通配符n?n*n与shell脚 本的相同2-1makefilev实例 源码-power.c#include main()float x,y;printf(“the program take x and from stdin and displays xy.n”);printf(“enter number x:”);scanf(“%f”,printf(“enter number y:”);scanf(“%f”,printf(“xy is %6.3fn”,power(double)x,(double)y);$cat MakefileSample makefile for the power programRemember:each command line starts with a TABpower:power.cgcc power.c -o power lm$制表符2-1makefilev当目标文件比关联文件更新v更新关联文件,对比$touch powerC$makegcc power.c o power lm仅仅只更新文 件的修改时间 为当前时间目标文件存在,且 比关联文件更新重新编译更新 的关联文件2-2依赖树v把power.c分成两个文件 #cat power.c #include double compute(double x,double y); main() float x,y;printf(”The program takes x from stdin and displays xy.n”);printf(”Enter number x:”);scanf(”f,$cat main.h/*Declaration of prompts to users */const char *PROMPTl=”Enter the value of x:”const char *PROMPT2=”Enter the value of y:”$cat inputC# include”inputh”double input(const char *s)floatx;printf(”s”,s);scanf(“f”,&x);return(x);$cat input.h /* Declaration of the”input”function*/ double input(char*);cat computeh /* Declaration of the“compute”function*/ double compute(double,double);2-2依赖树$cat mainc#include#include”mainh”#include”computeh”#include”inputh”main()double x,y;printf(”The program takes X and Y from stdin and displays xy.n”);x=input(PROMPTl);y=input(PROMPT2);printf(”xy is:6.3fn”,compute(x,y);2-2依赖树$ cat makefile power:main.o input.o compute.ogcc main.o input.o compute.o -o power -1m main.o:main.c main.h input.h compute.hgcc -c main.c input.o:input.c input.hgcc -c input.c compute.o:compute.c computehgcc -c compute.c $ makegcc -c main.cgcc -c input.cgcc -c compute.cgcc main.o input.o compute.o -o power -1m1.第一个先决条件 不存在,或者先决 条件作为目标文件 的先决条件更新。 生成第一个2.当所有的先决条 件更新后,生成最 终目标文件2-3默认模式规则-默认的后缀规则SUFFIXES:ocs.c.o:$(CC)$(CFLAGS)-c $.s.o:$(AS)$(ASFLAGS) -o $ $-默认的模式规则(gnu Make)%.o:%.c:$(CC)$(CFLAGS)-c $%.o:%.s$(AS)$(ASFLAGS) -o $ $-利用默认的规则修改后的makefile$cat makefilepower:main.o input.o compute.ogcc main.o input.o compute.o -o power -lmmain.o:main.h input.h compute.hinput.o:input.hcompute.o:compute.h内置变量 ,以后会 经常遇到阶段总结v为什么使用make?vMakefile的语法规则v依赖树的分析v默认的模式规则2-4简单变量v简单变量n定义: 变量名 :=文本n添加: 变量名 += 文本 v引用n$(变量名)n$变量名n$单字符变量C=gcc$C见过其他的模式吗 ?变量名 = 文本变量名 ?= 文本超出了本章的返回2-4简单变量$cat makefile CC := gcc OPTIONS := -O3 OBJECTS := main.o OBJECTS += input.o compute.o SOURCES := main.c inputc compute.c HEADERS := main.h input.h compute.h power:$(OBJECTS)$(CC)$(OPTIONS) -o power $(OBJECTS) -lm main.o:mainh inputh computeh input.o:inputh compute.o:computeh power.tar:makefile $(HEADERS) $(SOURCES)tar -cvf power.tar makefile $(HEADERS) $(SOURCES) clean:rm *.o $2-5 内置变量变量名意义$当前目标的名称$?比当前目标更新的一修改的依赖性列表$比当前目标更新的一修改的依赖性列表$用空格分开的所有依赖性列表2-5修改后的makefilecomplete:powerecho”Build complete”power:$(OBJECTS)$(CC)$(OPTIONS)-O $ $ -lmecho”The executable is in the power file”main.o:main.h input.h compute.hcompute.o:compute.hinput.o:input.hpower.tar:makefile $(HEADERS) $(SOURCES)tar -cvf $ $clean:rm-f *.o core power虚目标2-6虚目标v不存在的文件,而且也无需创建他们 v允许你强制执行某些事件,而这些事件在正常 规则中是不会发生的v规则虚目标和先决条件n如果虚目标作为先决条件使用,它必须作为目标出 现在某处n虚目标总是使与之有关的命令被执行n虚目标作为先决条件,总是是相应的目标重建2-6虚目标v常见虚目标列表目标意义all生成工程中所以可以执行者,通常是makefile的第一个生成 目标 test运行程序的自动测试套件clean删除make all生成的所有文件install在系统目录中安装工程项目生成的可执行文件和文档uninstall删除make install 安装的所有文件2-6虚目标$cat makefileINSTALLDIR=/home/sarwar/courses/bininstall:client servercp f $ $(INSTALLDIR)rm f *.o $cd $(INSTALLDIR);chmod 755 $uninstall:cd $(INSTALLDIR);rm client serverclient:client.o miscc.o rcopyc.ogcc client.o miscc.o rcopyc.o lnsl -o client client.o:client.c netc.h rcopy.hgcc -c clientc$make install. . . . . .
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号