1.什么是Makefile?
Makefile是一个文件,一般名字为(Makefile),里面存放的是工程项目的编译规则,他会根据文件的时间戳自动推导该源文件是否需要重新编译。
会不会Makefile,是是否具备开发大型项目的能力的体现。
2.什么是make?
make是一个可执行文件 在 /usr/bin 目录下
使用来解析Makefile的。
3.Makefile的语法格式
方式1:
标签1:
指令1
标签2:
指令2
例:
all:
gcc main.c -o app
clean:
rm app
执行时:
make 标签名
多个标签时,直接make 默认执行第一个标签
方式2:
目标:依赖 (目标要求必须顶满格写)
对应的指令 (指令要求必须以 Tab 键开头)
例:
app:main.c
gcc main.c -o app
4.执行Makefile:
直接make 就会在当前路径下找对应的Makefile文件执行
如果当前路径有多个Makefile文件时
make -f Makefile文件名 来执行对应的文件
例1:
app:main.o
gcc main.o -o app
main.o:main.s //这种写法的main.o叫目标 是要生成对应的main.o文件的
gcc -c main.s -o main.o
main.s:main.i
gcc -S main.i -o main.s
main.i:main.c
gcc -E main.c -o main.i
clean: //这种写法的clean 叫做伪目标,是不生成对应文件的
rm app main.o main.i main.s
执行make时,Makefile会自动推导依赖关系
app-->依赖-->main.o-->依赖-->main.s-->依赖-->main.i-->依赖-->main.c
所以最终的执行顺序:
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o app
Makefile中可以使用变量
使用方式和shell基本一样
区别,使用变量值时:
shell $VAR ${VAR}
Makefile $()
5.Makefile中变量赋值的问题:
= :会将变量在Makefile中所有的赋值都找到
:将最后一次赋值的结果赋值给新的变量
.eg:
var=abc
var1=$(var)
var=def
#@表示取消命令执行的回显
all:
@echo $(var) #def
@echo $(var1) #def
:= :立即赋值
.eg:
var2:=abc
var3:=$(var2)
var2:=def
#@表示取消命令执行的回显
all:
@echo $(var2) #def
@echo $(var3) #abc
+= 附加赋值
var4=abc
var4+=def
all:
@echo $(var4) #abc def
?= 询问?前的变量之前是否被赋值过,如果被赋值过
本次赋值不成立,否者本次赋值成立
var5=www.hqyj.com
var5 ?=www.farsight.com
all:
@echo $(var5) #www.hqyj.com
Makefile中的特殊变量
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖文件
6.Makefile中的通配符
* 在Makefile中使用shell指令时用的通配符 LS=$(shell ls *) :任意长度的任意字符
% Makefile中的通配符 :任意长度的任意字符
Makefile引用文件
-include 路径/文件名
Makefile中有什么?
5个 显式规则 隐晦规则 变量 注释 文件指示(包含头文件)
案例参考 makefile.tar.gz