Make编译学习笔记(三)Makefile基本规则
来源:互联网 发布:nginx grpc 编辑:程序博客网 时间:2024/05/02 02:14
所有的规则都以目标、依赖、和命令组成,最最简单的规则就是前面提到的这种规则
main: main.o insert.o search.o $(CC) -o main main.o insert.o search.o
Makefile 中规定了一些特殊目标,以 .PHONY 为例
main: main.o insert.o search.o gcc -o $@ $^.PHONY: cleanclean: rm *.o rm main
.PHONY 目标的作用是表示其依赖作为伪目标使用,伪目标不代表真正的文件名,可以放着和实际的文件名冲突还能提高 make 编译的效率。
如同 .PHONY 这样的目标还有许多,GNU make 支持的如下表
一个规则可以有个多目标,如果其依赖更新了那么所有的目标都会更新
通常使用静态模式规则可以更方便简单,例如
SOURCES := $(wildcard *.c)OBJECTS := $(patsubst %.c, %.o, $(SOURCES))main: $(OBJECTS) gcc -o $@ $^$(OBJECTS): %.o: %.c gcc -c $< -o $@.PHONY:cleanclean: rm *.o rm example
这个 Makefile 作用是编译工程文件夹中的所有 .c 文件
$(OBJECTS): %.o: %.c gcc -c $< -o $@
是一条静态模式规则,其依赖是通过 %.o: %.c 对变量 $(OBJECTS) 进行替换,若该工程目录中有 foo.c bar.c 两个源文件则等价与如下规则
foo.o bar.o: foo.c bar.c gcc -c $< -o $@
隐含规则是在 Makefile 中约定的一些规则,如果没有显示规则那么 make 编译时会自动使用隐含规则
常用的隐含规则如下
- 编译 C 程序时
以 .o 的目标其依赖会自动推到为 .c 且其生成命令为$(CC) –c $(CPPFLAGS) $(CFLAGS)
- 编译 C++ 程序时
以 .o 的目标的依赖会自动推导为 .cc 或是 .C,并且其生成命令是$(CXX) –c $(CPPFLAGS) $(CFLAGS)
- 编译 Pascal 程序时
以.o 的目标的依赖目标会自动推导为 .p,并且其生成命令是$(PC) –c $(PFLAGS)
- 编译 Fortran/Ratfor 程序时
以 .o 的目标的依赖目标会自动推导为
.r ,并且其生成命令为$(FC) –c $(FFLAGS)
或 .F,并且其生成命令为$(FC) –c $(FFLAGS) $(CPPFLAGS)
或 .f ,并且其生成命令为$(FC) –c $(FFLAGS) $(RFLAGS)
- 预处理 Fortran/Ratfor 程序时
以 .f 的目标的依赖会自动推导为
.r ,并且其生成命令为$(FC) –F $(CPPFLAGS) $(FFLAGS)
或 .F,并且其生成命令为$(FC) –F $(FFLAGS) $(RFLAGS)
)
这个规则只是转换 Ratfor 或有预处理的 Fortran 程序到一个标准的 Fortran 程序 - 编译 Modula-2 程序时
以 .sym 的目标的依赖会自动推导为 .def,并且其生成命令是$(M2C) $(M2FLAGS) $(DEFFLAGS)
以 .o 的目标的依赖会自动推导为 .mod,并且其生成命令是$(M2C) $(M2FLAGS) $(MODFLAGS)
- 汇编和汇编预处理时
以 .o 的目标的依赖会自动推导为 .s,默认使用编译器为 as,并且其生成命令是$(AS) $(ASFLAGS)
以 .s 的目标的依赖会自动推导为 .S,默认使用C预编译器 cpp,并且其生成命令是$(AS) $(ASFLAGS)
- 链接 Object 文件时,目标依赖于 .o,通过运行 C 的编译器来运行链接程序生成,若目标文件名为 foo,其生成命令是
$(CC) $(LDFLAGS) foo.o $(LOADLIBES) $(LDLIBS)
,这个规则对于只有一个源文件的工程有效,同时也对多个 Object 文件(由不同的源文件生成)的也有效 - Yacc C程序时(“Yacc”是一个语法分析器)
以 .c 为目标的依赖会自动推导为 .y(Yacc生成的文件),其生成命令是$(YACC) $(YFALGS)
- Lex C程序时
以 .c 为目标的依赖会自动推导为 .l(Lex生成的文件),其生成命令是$(LEX) $(LFALGS)
- Lex Ratfor程序时
以 .r 为目标的依赖会自动推导为 .l(Lex生成的文件),其生成命令是$(LEX) $(LFALGS)
- 从C程序、Yacc文件或Lex文件创建Lint库时
以 .ln(lint生成的文件)为目标的依赖会自动推导为 .c,其生成命令是$(LINT) $(LINTFALGS) $(CPPFLAGS) -i
。对于 .y 和 .l 同样适用
0 0
- Make编译学习笔记(三)Makefile基本规则
- Make编译学习笔记(一)Makefile基础
- Make编译学习笔记(二)Makefile中的变量
- make(三)makefile书写规则
- make及Makefile学习笔记
- 学习makefile(三)--书写规则
- makefile学习笔记(三)
- Makefile 和 make 规则
- makefile和make规则
- makefile 规则之---make命令-编译,依赖关系
- APM_PX4学习笔记(1):Make 编译
- linux学习笔记-Makefile规则
- GNU make 学习笔记(三)
- (二)Makefile的编写规则、make的运行规则
- Makefile学习笔记(三)
- makefile(三):隐含规则
- Make点滴学习-----2-MakeFile的规则语法
- GUN make学习笔记之make显示规则
- 通过IIS配置网站和相关错误处理
- Struts2入门——4,访问Action
- 找出出现次数大于等于总数一半的数 (O(1)空间 O(n)时间)
- [LeetCode] 152. Maximum Product Subarray
- 声明
- Make编译学习笔记(三)Makefile基本规则
- Perl语言入门(09 perl中自带的函数)
- 结构体指针分析
- 最长严格上升子序列
- HTML5所有标签汇总
- android application方法执行多次
- 首大写
- VS_VERSION_INFO resource
- 【Linux】CentOS 6.5 搭建httpd文件服务器