多模块软件的编译和链接.ppt_第1页
多模块软件的编译和链接.ppt_第2页
多模块软件的编译和链接.ppt_第3页
多模块软件的编译和链接.ppt_第4页
多模块软件的编译和链接.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

多模块软件的编译和链接 第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 多模块软件、依赖树和make Make实用程序 make实用程序对简单变量的支持 内建变量 命令行的使用和调试 1-1 多模块软件 v实用的软件都是拥有多个源文件 n这些源文件称之为模块 n多模块软件 v多模块软件 优点缺点 较小的程序文件易于维护知道所有文件的依赖性 只需编译经过修改的源文件,而不 是编译整个系统 跟踪所有文件修改的时间戳 支持信息隐藏必须键入很长的命令行 2-1make v一个差强人意的办法 n使用shell脚本 v上述的缺点,导致了make的产生。 $cat build.sc gcc c prog1.c prog2.c prog3.c gcc o prog prog1.o prog2.o prog3.o 2-1make vMake的产生 Make 程序最初来源于steve Johnson的一个拜访,那天他风风火 火的闯进我的办公室,诅咒命运之神让他浪费了一个早上来调试 一个正确的程序(bug修改了,但是没有编译,因此cc *.o无效) 。而我也花了前一个晚上的部分时间在我参与的项目中解决同样 的灾难,这样编写一个工具来解决这个问题的想法诞生了。最开 始是精细的依赖关系分析器,浓缩为更简单的东西后,周末就出 炉了make.新兴工具的使用也是unix文化的一部分。Make文件都是 文本的,不是神秘的二进制编码,因为就是unix的精神:可打印, 可调试,可理解。 -stuart Feldman 2-1make v管理多模块程序的编译和连接 v读取一个说明文件-makefile n描述系统中各模块的依赖关系 vMake使重编译的次数达到最小化 nMakefile描述的依赖关系 n各组件文件的时间戳 vMakefile 实质上是一种脚本语言 2-1Make 语法Make 选项 目标 宏定义 目的Make程序更新文件是基于存放在一个文件中的依赖关系 ,称为Makefile。 2-1make 常用选项特性 -d显示调试信息 -f 指定从哪个文件中读取依赖关系信息。 默认文件是”Makefile” 或 “makefile” “-” 表示从标准输入 -h显示所有选项的简要说明 -n不运行任何Makefile命令,只显示他们 -s安静的方式运行,不显示任何信息 2-1makefile 目标列表: 关联性列表 命令列表 目标列表: 关联性列表; 命令列表 也称为先决条件 2-1makefile v注释 n# v连接符 n v关联列表和命令列表中使用shell通配符 n? n* n 与shell脚 本的相同 2-1makefile v实例 源码-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 Makefile Sample makefile for the power program Remember:each command line starts with a TAB power:power.c gcc power.c -o power lm $ 制表符 2-1makefile v当目标文件比关联文件更新 v更新关联文件,对比 $touch powerC $make gcc 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.o gcc main.o input.o compute.o -o power -1m main.o:main.c main.h input.h compute.h gcc -c main.c input.o:input.c input.h gcc -c input.c compute.o:compute.c computeh gcc -c compute.c $ $ make gcc -c main.c gcc -c input.c gcc -c compute.c gcc main.o input.o compute.o -o power -1m 1.第一个先决条件 不存在,或者先决 条件作为目标文件 的先决条件更新。 生成第一个 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 makefile power:main.o input.o compute.o gcc main.o input.o compute.o -o power -lm main.o:main.h input.h compute.h input.o:input.h compute.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修改后的makefile complete:power echo”Build complete” power:$(OBJECTS) $(CC)$(OPTIONS)-O $ $ -lm echo”The executable is in the power file” main.o:main.h input.h compute.h compute.o:compute.h input.o:input.h power.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 makefile INSTALLDIR=/home/sarwar/courses/bin install:client server cp f $ $(INSTALLDIR) rm f *.o $ cd $(INSTALLDIR);chmod 755 $ uninstall: cd $(INSTALLDIR);rm client server client:client.o miscc.o rcopyc.o gcc client.o miscc.o rcopyc.o lnsl -o client client.o:client.c netc.h rcopy.h gcc -c clientc $make install . . . . . . . 1.不存在的文件,仅为完成某些功能 2.如果目录下存在这个同名文件会出 现什么情况? 2-7特殊目标 v上述问题用.PHONY的特殊目标解决 .PHONY:clean clean: rm rf *.o 2-7特殊目标 特殊目标目的 .DEFAULTS 如果make找不到生成目标的任何makefile入口或后缀规则,它 就执行与目标相关的命令 .IGNORE如果某一行makefile包含该目标,make忽略错误代码并继续建 立,;如果一个命令不正常存在, make自然会停止。带有-i选 项的make命令可以执行相同的任务 .PHONY允许您指定一个不是文件的目标,所以您能指示make调用一系 列makefile中的命令,即使在您的当前目录中有一个具有目标 名称的文件 .SILENTmake执行这些命令但不显示这些命令,带有-s选项的make可 以执行相同的任务。如7.2.5节所讨论的,在该命令前放置一个 符号就可以执行一个特别命令 .SUFFIXES为目标指定的前提(后缀)可以与后缀规则相关联。如果与目标没 有相关联的前提,已存在 的后缀列表就会被删除 2-8一般性语法错误 vTab键 v在和换行符插入了空格 $make Makefile:4:*missing separator.Stop $cat t Makefile $grep Makefile $ cat e Makefile $grep $ Makefile 2-9命令行的使用和调试 v使用非标准的Makefile名称 v从标准输入读取 v显示所执行的顺序 $ make f prog1.makefile $make -f- $make -n 3-1autoconf v创建安装shell脚本的工具 nconfigure n一旦configure生成,无需autoconf vAutoconf打包的软件 n./configure nmake nmake install 3-1autoconf vAutoconf 实际上是个工具集 工具描述 Autoconf使用模板文件作为输入,该工具产生的配置脚本可生成make程序的 描述文件,以及适合当前平台(或指定平台)的安装脚本 Autoheader该程序创建一个模板文件,当中包括autoconf创建的configure脚 本使用的#include语句 autoreconf文件的时间戳表明需要通过运行autoconf更新文件时,该程序可以 更新配置脚本 autoupdate程序更新存在的模板文件,以匹配autoconf当前版本的语法 ifnames 程序浏览出现在#if、#elif,#ifdef和#ifndef预处理指示字中所有 C的源文件。列表是排序的,每个名字都包括其中找到文件名的列 表 3-1autoconf v确定条件编译 n$ifnames *.c *.h n输出为条件定义的宏的列表,以及定义他们的文件 v创建configure.in文件 n$autoscan n$move configure.scan configure.in 3-1autoconf v编辑configure.in文件 n由m4宏指示字组成 n被autoconf解析,生成configure脚本 v创建makefile.in文件 n修改自己的makefile文件来包含autoconf产生 的定义 任务的主 要部分 3-1autoconf v创建config.h.in文件 n$autoheader nconfig.h文件的输入 v更新源文件 n所有的考虑移植的源文件,需要包含config.h 3-1autoconf v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论