makefile基础
编译和链接
- 编译:编译时,编译器需要的是语法的正确,函数与变量的 声明的正确。
- 链接:链接时,主要是链接函数和全局变量
makefile
基础格式
target : prerequisites
command
- target:目标文件
- prerequisites:依赖文件
- command:生成规则
- PS:make 会比较 targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的 日期要比 targets 文件的日期要新,或者 target 不存在的话,那么,make 就会执行后续定义的命令
- 自动推导:只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make 找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 cc -c whatever.c 也会被推导出来。
- 在 Makefile 中的command命令,必须要以[Tab]键开始。
clean的写法
.PHONY : clean clean :
-rm edit $(objects)
- .PHONY 意思表示 clean 是一个“伪目标”
- rm 命令前面加了一个小 减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。
- clean 从来都是放在文件的最后
makefile构成
- 显示规则
生成文件、依赖文件、生成命令 - 隐晦规则
自动推导 - 变量的定义
一般都是字符串 - 文件指示
- 一个 Makefile 中引用另一个 Makefile
- 根据某些情况指定 Makefile 中的有效部分
- 定义一个多行的命令
- 注释
使用其他的makefile
- 命名:Make.Linux
- 调用:make -f Make.Linux 或 make --file Make.Linux
引用其他的makefile
引用方式
- 可以直接include
- 使用shell的 “* ” 遍历
- include 变量
bar+=e.mk
bar+=f.mk
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
makefile 查找方式
- 优先当前目录
- 如果 make 执行时,有“-I”或“–include-dir”参数,那么 make 就会在这个参数所指定的目录下去寻找。
- 如果目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找。
- 无论 include 过程中出现什么错误,都不要报错继续执行的方法:
-include <filename>
make 的工作方式
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
添加define
EXTRA_CFLAGS += -D
警告编译不过
CFLAGS += $(INCLUDE) -O2 -Wall -muclibc -Werror
把-Werror删了