


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、makefile隐含规则贾明伟引用请标注请勿修改导航介绍makefile隐含规则变量介绍makefilemakefile是gcc的工程化文件,即用固定的格式,调用编译器编译和链接程序。语法规则target:prerequisites command target:目标文件,也就是需要生成的文件 prerequisites:依赖文件,生成目标文件所需的文件 command:生成target需执行的动作,行首要用tab键 prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。这是makefile动作执行规则的核心。目标1. 如果工
2、程没有编译过,那么工程的所有 c 文件都要编译并被链接。2. 如果工程的某几个 c 文件被修改,那么只编译被修改的 c 文件,并链接目标程序。3. 如果工程的头文件改变了,那么只编译引用了这几个头文件的 c 文件,并链接目标程序。例1main:main.o abc.o xyz.o gcc main.o abc.o xyz.o -o mainmain.o:main.c abc.h xyz.h gcc -c main.c o main.oabc.o:abc.c abc.h xyz.h gcc -c abc.c o abc.oxyz.o:xyz.c xyz.h gcc -c xyz.c -o xyz
3、.o这个例子生成main.o abc.o xyz.o,再由此三个.o生成main。该例子满足三个目标,可以按规则逐一核对。隐含规则例2CC=gccmain:abc.o xyz.omain.o:abc.h xyz.habc.o:abc.hxyz.o:xyz.h例2和例1的功能相同,其中的简化就是隐含规则,这种简化适合在工程中使用。定义“隐含规则”也就是一种惯例,make 会按照这种“惯例”心照不喧地来运行,哪怕makefile中没有书写这样的规则。隐含规则一览隐含规则都是“后缀规则”,如下:1. 编译 C 程序的隐含规则。 .o 目标文件的依赖目标会自动推导为.c , 并且其生成命令是 $(CC
4、) c $(CPPFLAGS) $(CFLAGS)1. 编译 C+ 程序的隐含规则。 .o 目标文件的依赖目标会自动推导为 .cc 或是 .C , 并且其生成命令是 $(CXX) c $(CPPFLAGS) $(CFLAGS) 。2. 编译 Pascal 程序的隐含规则。 .o 目标文件的依赖目标会自动推导为 .p ,并且其生成命令是 $(PC) c $(PFLAGS) 。3. 编译 Fortran/Ratfor 程序的隐含规则。 .o 目标文件的依赖目标会自动推导为 .r 或 .F 或 .f ,并且其生成命令是: .f $(FC) c $(FFLAGS) .F $(FC) c $(FFLAG
5、S) $(CPPFLAGS) .f $(FC) c $(FFLAGS) $(RFLAGS) .r $(FC) F $(FFLAGS) $(RFLAGS)4. 编译 Modula-2 程序的隐含规则。 .sym 目标文件的依赖目标会自动推导为 .def , 并且其生成命令是:$(M2C) $(M2FLAGS) $(DEFFLAGS) .o 目标文件的依赖目标会自动推导为 .mod ,并且其生成命令是:$(M2C) $(M2FLAGS) $(MODFLAGS) 。5. 汇编和汇编预处理的隐含规则。 .o 目标文件的依赖目标会自动推导为 .s ,默认使用编译器as ,并且其生成命令是:$ (AS)
6、$(ASFLAGS) 。 .s 目标文件的依赖目标会自动推导为 .S ,默认使用 C 预编译器 cpp ,并且 其生成命令是:$(AS) $(ASFLAGS) 。6. 链接 Object 文件的隐含规则。 程序目标文件依赖于 .o ,通过运行 C 的编译器来运行链接程序生成(一般是 ld ),其生成命令是:$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS) 。 这个规则对多个 Object 文件(由不同的源文件生成)的也有效。例如如下规则: x : y.o z.o 并且 x.c 、y.c 和 z.c 都存在时,隐含规则将执行如下命令: cc -c x.c -o
7、 x.o cc -c y.c -o y.o cc -c z.c -o z.o cc x.o y.o z.o -o x rm -f x.o rm -f y.o rm -f z.o 如果名称不匹配,例如上面x并没有x.c匹配,则隐含规则会报错。7. Yacc C 程序时的隐含规则。 .c 目标文件的依赖文件被自动推导为 .y (Yacc 生成的文件),其生成命令是:$(YACC) $(YFALGS)8. Lex C 程序时的隐含规则。 .c 目标文件的依赖文件被自动推导为 .l(Lex 生成的文件),其生成命令是:$(LEX) $(LFALGS) 。9. Lex Ratfor 程序时的隐含规则。
8、.r 目标文件的依赖文件被自动推导为 .l (Lex 生成的文件),其生成命令是:$(LEX) $(LFALGS) 。10. 从 C 程序、Yacc 文件或 Lex 文件创建 Lint 库的隐含规则。 .ln目标文件(lint 生成的文件)的依赖文件被自动推导为 .c ,其生成命令是:$(LINT) $(LINTFALGS) $(CPPFLAGS) -i 。对于 .y 和 .l 也是同样的规则。隐含规则链隐含规则链就是一个目标文件可能被一系列的隐含规则所作用。例如一个 .o 的文件生成,可能会是先被 Yacc 的 .y 文件先成 .c ,然后再被 C 的编译器生成。我们把这种 .c 的文件,叫
9、做中间目标文件。make在执行过程中会努力自动推导生成中间目标文件,不管中间目标有多少,其都会执着地把所有的隐含规则和你书写的规则全部合起来分析,努力生成目标文件。中间目标文件和目标文件有两个不同: 除非中间目标文件不存在,才会推导生成。 产生目标文件过程中产生的中间目标文件会被删除(设置伪目标文件保存,但此方法严格来说不算自动推导。伪目标在这里不详述。)。见隐含规则一览的第7条。定义模式规则模式规则1%.o : %.ccommand目标中的 % 定义表示对 文件名的匹配,% 表示长度任意的非空字符串。若是%.c, 表示以 .c 结尾的文件名;若是s.%.c ,则表示以 s. 开头,.c 结尾
10、的文件名。模式规则1举例%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $该例子中'$<'表示全部依赖文件中的一个,'$'表示生成的目标文件。整体完成的是将所有的 .c 文件都编译成 .o 文件。模式规则2模式规则2其实是一种老的表示方法,在一些老的工程中可以见到,因为没有%.o : %.c的模式规则1清晰,所以被取代。.c.o:$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $ $<该例子也是将所有的 .c 文件都编译成 .o 文件。模式规则2不允许依赖任何文件,如果有依赖文件
11、的话,.c.o会被认为是个文件名而不是模式规则。如下面这种情况:.c.o: foo.h$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $ $<变量makefile书写过程中,会用到很多的变量,尤其是在隐含规则中,现将其罗列以供查找。变量分为以下两种: 命令变量 AR : 函数库打包程序。默认命令是 ar AS : 汇编语言编译程序。默认命令是 as CC : C 语言编译程序。默认命令是 cc CXX : C+ 语言编译程序。默认命令是 g+ CO : 从 RCS 文件中扩展文件程序。默认命令是 co CPP : C 程序的预处理器(输出是标准输出设备)。默认命令是
12、$(CC) E FC : Fortran 和 Ratfor 的编译器和预处理程序。默认命令是 f77 GET : 从 SCCS 文件中扩展文件的程序。默认命令是 get LEX : Lex 方法分析器程序(针对于 C 或 Ratfor)。默认命令是 lex PC : Pascal 语言编译程序。默认命令是 pc YACC : Yacc 文法分析器(针对于 C 程序)。默认命令是 yacc YACCR : Yacc 文法分析器(针对于 Ratfor 程序)。默认命令是 yacc r MAKEINFO : 转换 Texinfo 源文件(.texi)到 Info 文件程序。默认命令是 makeinf
13、o TEX : 从 TeX 源文件创建 TeX DVI 文件的程序。默认命令是 tex TEXI2DVI : 从 Texinfo 源文件创建军 TeX DVI 文件的程序。默认命令是 texi2dvi WEAVE : 转换 Web 到 TeX 的程序。默认命令是 weave CWEAVE : 转换 C Web 到 TeX 的程序。默认命令是 cweave TANGLE : 转换 Web 到 Pascal 语言的程序。默认命令是 tangle CTANGLE : 转换 C Web 到 C。默认命令是 ctangle RM : 删除文件命令。默认命令是 rm f 命令参数变量 ARFLAGS : 函数库打包程序 AR 命令的参数。默认值是 rv ASFLAGS : 汇编语言编译器参数。 CFLAGS : C 语言编译器参数。 CXXFLAGS : C+ 语言编译器参数。 COFLAGS : RCS 命令参数。 CPPFLAGS : C 预处理器参数。(C 和 Fortran 编译器也会用到)。 FFLAGS : Fortran 语言编译器参数。 GFLAGS : SCCS “get”程序参数。 LDFLAGS : 链接器参数。 LFLAGS : Le
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 轮作与连作教学设计-2025-2026学年中职专业课-农作物生产-农林类-农林牧渔大类
- 2025资产与权益的赠与合同
- 2025设备租赁合同已调整
- 促成下单教学设计-2025-2026学年中职专业课-客户服务-电子商务-财经商贸大类
- 第二单元第四课《认识计算机操作系统》说课稿-2024-2025学年粤教版(2019)初中信息技术七年级上册
- 第12课 宋元时期的都市和文化说课稿-2025-2026学年初中历史与社会部编版七年级下册-部编版
- 铺面租房合同范本
- 1.2细胞的多样性和统一性第1课时教学设计-2024-2025学年高一上学期生物人教版必修1
- 淄博文旅面试题库及答案
- 2025太阳能热水系统安装合同
- 运输安装费合同协议
- 母子亲属房产赠与合同5篇
- 《当代企业经营战略》课件
- 医学科研实验技术的发展与趋势展望
- 生猪购买协议书范本
- 酒吧服务考试题及答案
- 摄影工作室合伙协议
- 铁路路外环境安全课件
- 《心肌梗死急救护理》课件
- 急性心力衰竭中国指南(2022-2024)解读
- 第一单元第1课《辉煌成就》课件-七年级美术下册(人教版)
评论
0/150
提交评论