多模块软件的编译和链接

上传人:公**** 文档编号:591398303 上传时间:2024-09-17 格式:PPT 页数:44 大小:2.10MB
返回 下载 相关 举报
多模块软件的编译和链接_第1页
第1页 / 共44页
多模块软件的编译和链接_第2页
第2页 / 共44页
多模块软件的编译和链接_第3页
第3页 / 共44页
多模块软件的编译和链接_第4页
第4页 / 共44页
多模块软件的编译和链接_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《多模块软件的编译和链接》由会员分享,可在线阅读,更多相关《多模块软件的编译和链接(44页珍藏版)》请在金锄头文库上搜索。

1、多模块软件的编译和链接多模块软件的编译和链接多模块软件的编译和链接多模块软件的编译和链接第第7章章预习检查预习检查v$make f 文件,是什么文件?文件,是什么文件?遵循makefile语法的文件,也就是makefile文件v目标列表目标列表: 关联性列表,含义是什么?关联性列表,含义是什么?目标列表依赖于关联性列表v简单变量的定义方式?简单变量的定义方式?变量名 := 文本v举一个举一个make内置变量的例内置变量的例CFLAGS, $,$?等vmake clean,clean常见的含义是什么?常见的含义是什么?clean是虚目标,删除make生成的文件2本章目标本章目标v了解了解Make

2、Make实用程序的功能实用程序的功能v使用使用makefilemakefile管理多模块软件管理多模块软件v掌握掌握makefilemakefile的规则,变量的规则,变量v掌握掌握makefilemakefile的虚目标规则的虚目标规则v了解了解autoconfautoconf的原理和用法的原理和用法本章结构本章结构简介多模块软件的编译和链接Makefile和Make Rules默认规则虚目标特殊目标一般性语法错误及其纠正措施autoconf多模块软件、依赖树和makeMake实用程序make实用程序对简单变量的支持内建变量命令行的使用和调试1-1 多模块软件多模块软件v实用的软件都是拥有多

3、个源文件实用的软件都是拥有多个源文件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 Make 程序最

4、初来源于程序最初来源于stevesteve Johnson Johnson的一个拜访,那天他风风火的一个拜访,那天他风风火火的闯进我的办公室,诅咒命运之神让他浪费了一个早上来调试火的闯进我的办公室,诅咒命运之神让他浪费了一个早上来调试一个正确的程序一个正确的程序(bug(bug修改了,但是没有编译,因此修改了,但是没有编译,因此cc *.occ *.o无效)。无效)。而我也花了前一个晚上的部分时间在我参与的项目中解决同样的而我也花了前一个晚上的部分时间在我参与的项目中解决同样的灾难,这样编写一个工具来解决这个问题的想法诞生了。最开始灾难,这样编写一个工具来解决这个问题的想法诞生了。最开始是精细

5、的依赖关系分析器,浓缩为更简单的东西后,周末就出炉是精细的依赖关系分析器,浓缩为更简单的东西后,周末就出炉了了make.make.新兴工具的使用也是新兴工具的使用也是unixunix文化的一部分。文化的一部分。MakeMake文件都是文文件都是文本的,不是神秘的二进制编码,因为就是本的,不是神秘的二进制编码,因为就是unixunix的精神的精神: :可打印,可可打印,可调试,可理解。调试,可理解。 -stuartstuart Feldman Feldman2-1makev管理多模块程序的编译和连接管理多模块程序的编译和连接v读取一个说明文件读取一个说明文件-makefilen描述系统中各模块的

6、依赖关系vMake使重编译的次数达到最小化使重编译的次数达到最小化nMakefile描述的依赖关系n各组件文件的时间戳vMakefile 实质上是一种脚本语言实质上是一种脚本语言2-1Make语法语法Make 选项选项 目标目标 宏定义宏定义 目的Make程序更新文件是基于存放在一个文件中的依赖关系,称为Makefile。2-1make常用选项常用选项特性特性-d显示调试信息-f 指定从哪个文件中读取依赖关系信息。默认文件是”Makefile” 或 “makefile”“-” 表示从标准输入-h显示所有选项的简要说明-n不运行任何Makefile命令,只显示他们-s安静的方式运行,不显示任何信

7、息2-1makefile目标列表: 关联性列表命令列表目标列表: 关联性列表; 命令列表也称为先决条件2-1makefilev注释注释 n#v连接符连接符nv关联列表和命令列表中使用关联列表和命令列表中使用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”,&x); printf(“ent

8、er number y:”); scanf(“%f”,&y); 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更新关联文件,对比更新关联文件,对比$makemake:poweris up to date$to

9、uch 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,&x); printf(”Enter

10、 number y:”); scanf(”f,&y); printf(”xy is:63fn”, compute(x,y);#cat compute.c#includedouble compute(double x,double y) return(pow(double)x,(double)y);2-2依赖树依赖树power.ocompute.opower:power.o compute.ogcc power.o compute.o -o power -lm2-2依赖树依赖树power.ocompute.opower:power.ocompute.ogcc power.o compute.o

11、-o power -lmpower.o:power.cgcc c power.ccompute.o:compute.cgcc c compute.cpower.ccompute.c$makegcc -c power.cgcc -c compute.cgcc power.o compute.o -o power lm树中节点的处理是自底向上的,由叶结点的符节点开始2-2依赖树依赖树v进一步分成六个文件,建立依赖树进一步分成六个文件,建立依赖树$cat computecincludeinclude”computeh”double compute(double x,double y) return(

12、pow(double)x,(double)y);$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

13、”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(

14、PROMPT2); printf(”xy is:6.3fn”,compute(x,y);2-2依赖树依赖树$ cat makefilepower:main.o input.o compute.o gcc main.o input.o compute.o -o power -1mmain.o:main.c main.h input.h compute.h gcc -c main.cinput.o:input.c input.h gcc -c input.ccompute.o:compute.c computeh gcc -c compute.c$ makegcc -c main.cgcc -c

15、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 $ $-利用默认的规则修改后的makefi

16、le$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$

17、单字符变量C=gcc$C见过其他的模式吗?变量名 = 文本变量名 ?= 文本超出了本章的返回2-4简单变量简单变量$cat makefileCC := gccOPTIONS := -O3OBJECTS := main.o OBJECTS += input.o compute.oSOURCES := main.c inputc compute.cHEADERS := main.h input.h compute.hpower:$(OBJECTS) $(CC)$(OPTIONS) -o power $(OBJECTS) -lmmain.o:mainh inputh computehinput.o:

18、inputhcompute.o:computehpower.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 $ $

19、 -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规则虚目标和

20、先决条件规则虚目标和先决条件n如果虚目标作为先决条件使用,它必须作为目标出现在某处n虚目标总是使与之有关的命令被执行n虚目标作为先决条件,总是是相应的目标重建2-6虚目标虚目标v常见虚目标列表常见虚目标列表目标目标意义意义all生成工程中所以可以执行者,通常是makefile的第一个生成目标test运行程序的自动测试套件clean删除make all生成的所有文件install在系统目录中安装工程项目生成的可执行文件和文档uninstall删除make install 安装的所有文件2-6虚目标虚目标$cat makefileINSTALLDIR=/home/sarwar/courses/bi

21、ninstall:client servercp f $ $(INSTALLDIR)rm f *.o $ cd $(INSTALLDIR);chmod 755 $uninstall: cd $(INSTALLDIR);rm client server client:client.o miscc.o rcopyc.ogcc client.o miscc.o rcopyc.o lnsl -o client client.o:client.c netc.h rcopy.h gcc -c clientc$make install . . . . . . . 1.不存在的文件,仅为完成某些功能2.如果目

22、录下存在这个同名文件会出现什么情况?2-7特殊目标特殊目标v上述问题用上述问题用.PHONY的特殊目标解决的特殊目标解决.PHONY:cleanclean:rm rf *.o2-7特殊目标特殊目标特殊目标特殊目标目的目的.DEFAULTS 如果make找不到生成目标的任何makefile入口或后缀规则,它就执行与目标相关的命令.IGNORE如果某一行makefile包含该目标,make忽略错误代码并继续建立,;如果一个命令不正常存在, make自然会停止。带有-i选项的make命令可以执行相同的任务.PHONY允许您指定一个不是文件的目标,所以您能指示make调用一系列makefile中的命令

23、,即使在您的当前目录中有一个具有目标名称的文件.SILENTmake执行这些命令但不显示这些命令,带有-s选项的make可以执行相同的任务。如7.2.5节所讨论的,在该命令前放置一个符号就可以执行一个特别命令.SUFFIXES为目标指定的前提(后缀)可以与后缀规则相关联。如果与目标没有相关联的前提,已存在 的后缀列表就会被删除2-8一般性语法错误一般性语法错误vTab键键v在在和换行符插入了空格和换行符插入了空格$makeMakefile:4:*missing separator.Stop$cat t Makefile$grep Makefile$ cat e Makefile$grep $

24、Makefile2-9命令行的使用和调试命令行的使用和调试v使用非标准的使用非标准的Makefile名称名称v从标准输入读取从标准输入读取v显示所执行的顺序显示所执行的顺序$ make f prog1.makefile$make -f-$make -n3-1autoconfv创建安装创建安装shell脚本的工具脚本的工具nconfiguren一旦configure生成,无需autoconfvAutoconf打包的软件打包的软件n./configurenmakenmake install3-1autoconfvAutoconf 实际上是个工具集实际上是个工具集工具工具描述描述AutoconfAu

25、toconf使用模板文件作为输入,该工具产生的配置脚本可生成使用模板文件作为输入,该工具产生的配置脚本可生成makemake程序的程序的描述文件,以及适合当前平台描述文件,以及适合当前平台( (或指定平台或指定平台) )的安装脚本的安装脚本AutoheaderAutoheader该程序创建一个模板文件,当中包括该程序创建一个模板文件,当中包括autoconfautoconf创建的创建的configureconfigure脚脚本使用的本使用的#include#include语句语句autoreconfautoreconf文件的时间戳表明需要通过运行文件的时间戳表明需要通过运行autoconfau

26、toconf更新文件时,该程序可以更新文件时,该程序可以更新配置脚本更新配置脚本autoupdateautoupdate程序更新存在的模板文件,以匹配程序更新存在的模板文件,以匹配autoconfautoconf当前版本的语法当前版本的语法ifnamesifnames程序浏览出现在程序浏览出现在#ifif、# #elif,#ifdefelif,#ifdef和和# #ifndefifndef预处理指示字中所有预处理指示字中所有C C的源文件。列表是排序的,每个名字都包括其中找到文件名的列的源文件。列表是排序的,每个名字都包括其中找到文件名的列表表3-1autoconfv确定条件编译确定条件编译n

27、$ifnames *.c *.hn输出为条件定义的宏的列表,以及定义他们的文件v创建创建configure.in文件文件n$autoscann$move configure.scan configure.in3-1autoconfv编辑编辑configure.in文件文件n由m4宏指示字组成n被autoconf解析,生成configure脚本v创建创建makefile.in文件文件n修改自己的makefile文件来包含autoconf产生的定义任务的主要部分3-1autoconfv创建创建config.h.in文件文件n$autoheadernconfig.h文件的输入v更新源文件更新源文件n

28、所有的考虑移植的源文件,需要包含config.h3-1autoconfv创建安装脚本创建安装脚本n$autconfv复制复制autoconf脚本脚本nAutoconf 的其他脚本nconfig.guessnConfig.subnInstall-shn包含在目录/usr/lib/autoconf中阶段总结阶段总结Makefile 简单变量的定义简单变量的定义Makefile的内置变量的内置变量虚目标与常用虚目标虚目标与常用虚目标Makefile常见的语法错误常见的语法错误Autoconf 打包软件的安装打包软件的安装用用autoconf打包软件打包软件本章总结本章总结简介多模块软件的编译和链接M

29、akefile和Make Rules默认规则虚目标特殊目标一般性语法错误及其纠正措施autoconf多模块软件、依赖树和makeMake实用程序make实用程序对简单变量的支持内建变量命令行的使用和调试多模块软件编译的困境分析make的原理,make程序的用法,以及Makefile的语法,规则,以及makefile对变量的支持,描述了虚目标,以及makefile的语法错误检查方法 描述了autoconf打包软件的安装,以及如何用autoconf打包软件实验实验v任务任务1:为:为hello world 编写编写makefilev任务任务2:autoconf的简单应用的简单应用任务任务1v注意事项注意事项n提示1:n编写一个头文件,两个C文件nmain.c 是主程序nhello.c编写打印”hello,world”的函数n提示2:n编写makefile,建立直接的依赖关系n使用默认规则n定义变量CROSS_COMPILE :=CC := (CROSS_COMPILE)gcc任务任务2v确认系统中存在确认系统中存在autoscan,autoconf命令命令v编写编写hello.c以及以及makefile44

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号