一、规则
对于范例1.1
执行make
输出"hello all" (默认是第一目标 all)
执行make all
输出"hello all"。 执行make test
输出"hello test"
对于范例1.2
执行make
(默认是第一个目标 test)
对于范例1.3
执行make
先执行依赖目标test,再执行all
注意是Tab,而不能是空格
二、gcc编译
foo.c
#include <stdio.h> void foo () { printf("This is foo ()!\n"); }
main.c
extern void foo(); int main () { foo(); return 0; }
直接用gcc就能编译出main了
gcc -o main main.c foo.c
三、make编译程序
.PHONY: main clean test: main foo.o gcc -o simple main.o foo.o main: main.c gcc -o main.o -c main.c foo.o: foo.c gcc -o foo.o -c foo.c clean: rm simple main.o foo.o
上面依次执行
gcc -o foo.o -c foo.c gcc -o main.o -c main.c gcc -o simple main.o foo.o
四、伪对象.PHONY
如果不加 .PHONY: main clean
test: main foo.o gcc -o simple main.o foo.o main: main.c gcc -o main.o -c main.c foo.o: foo.c gcc -o foo.o -c foo.c clean: rm simple main.o foo.o
如果当前文件目录下存在 上面对象中的任意一个,比如main或者clean,再去执行make,都会发生错误。
比如目录下有个main文件,再去执行,就会出错。
因此可以加入.PHONY: main
,使得去忽略当前目录下的main文件。
另外补充了clean,去删除当前目录下生成的内容
五、变量
引⼊了 CC 和 RM 两个变量,⼀个⽤于保存编译器名,⽽另⼀个⽤于指示删除⽂件的命令是什么。还有就是引⼊了 EXE 和 OBJS 两个变量,⼀个⽤于存放可执⾏⽂件名,可另⼀个则⽤于放置所有的⽬标⽂件名。采⽤变量的话,当我们需要更改编译器时,只需更改变量赋值的地⽅,⾮常⽅便
.PHONY: clean CC = gcc RM = rm EXE = simple OBJS = main.o foo.o $(EXE): $(OBJS) $(CC) -o $(EXE) $(OBJS) main.o: main.c $(CC) -o main.o -c main.c foo.o: foo.c $(CC) -o foo.o -c foo.c clean: $(RM) $(EXE) $(OBJS)
注意:依赖是从左到右的,比如 sample:main.o foo.o
六、自动变量
如果想采⽤ echo 输出‘$’
,则必需⽤两个连着的‘$’
。还有就是,$@
对于 Shell 也有特殊的意思,我
们需要在“$$@
”之前再加⼀个脱字符‘\
’
.PHONY: all all: first second third @echo "\$$@ = $@" @echo "$$^ = $^" @echo "$$< = $<" first: @echo "1 first" second: @echo "2 second" third: @echo "3 third"
make的输出结果
七、常用函数