隐含规则
make默认将.c文件编译成对应的.o目标文件
对没有命令行的规则
寻找一个隐含的规则来执行
.PHONY:clean
test1 test2:
@echo "test:"
hello:player.o lcd.o media.o
gcc -o $@ $^
#%.o:%.c
# gcc -o $@ -c $^
clean:
rm *.o hello
make 结果:
root@ubuntu:~/lesson/chap2/2-8/2-8-1# make
gcc -o hello.o -c hello.c
gcc -o hello hello.o
root@ubuntu:~/lesson/chap2/2-8/2-8-1# ls
hello hello.c hello.o makefile
取消隐含规则
使用make -r
或make -R
参数取消隐含规则
隐含变量
命令变量
CC:编译程序,默认是cc
AS:汇编程序,默认是as
CXX:C++编译程序,默认g++
AR:函数库打包程序,默认是ar
命令参数变量
CFLAGS:执行CC编译器的命令行参数
CXXFLAGS:执行g++编译器命令行参数
ASFLAGS:执行汇编器AS命令行参数
ARFLAGS:执行AR命令行参数
更多参数:LDFLAGS、CPPFLAGS
.PHONY:all
all:
@echo "CC=$(CC)"
@echo "AS=$(AS)"
@echo "CXX=$(CXX)"
@echo "AR=$(AR)"
@echo "CFLAGS=$(CFLAGS)"
@echo "CXXFLAGS=$(CXXFLAGS)"
@echo "ASFLAGS=$(ASFLAGS)"
@echo "ARFLAGS=$(ARFLAGS)"
@echo "LDFLAGS=$(LDFLAGS)"
make结果:
root@ubuntu:~/lesson/chap2/2-8/2-8-2# make
CC=cc
AS=as
CXX=g++
AR=ar
CFLAGS=
CXXFLAGS=
ASFLAGS=
ARFLAGS=rv
LDFLAGS=
模式规则
使用模式规则来定义一个隐式规则
模式规则,至少在规则的目标定义中包含%
%:任意长度的非空字符串,表示对文件名的匹配
在目标文件名中,%匹配的部分称为“茎”
目标和目标依赖同时含有%
依赖目标的茎会传给目标
多目标模式规则
同一个模式规则可以存在多个目标
普通多目标规则:每个目标作为一个独立规则处理;多个目标对应多个独立规则。
多目标模式规则:所有规则目标共同拥有依赖文件和规则的命令行,当文件符合多个目标模式中的任何一个时,规则定义的命令执行
.PHONY:clean
test1 test2:
@echo "test:"
hello:player.o lcd.o media.o
gcc -o $@ $^
%.o:%.c
gcc -o $@ -c $^
clean:
rm *.o hello
make 结果:
root@ubuntu:~/lesson/chap2/2-8/2-8-1# make
gcc -o hello.o -c hello.c
gcc -o hello hello.o
root@ubuntu:~/lesson/chap2/2-8/2-8-1# ls
hello hello.c hello.o makefile