2.目标的划分
目标依赖
3.默认规则:
a.不指定目标,执行第一个目标
b.不指定make文件,默认文件是makefile Makefile
makefile优先
4.目标的调用规则:(make把目标当作文件)
make执行目标:
搜索与目标相同的文件
如果文件存在,则判定日期。
日期最新,则停止执行,输出提示
日期不是最新,则进行执行。
比较:当前目标与依赖目标
--------》 换一句话说就是,当目标名不存在的时候,执行该条目标指令。若该目标名存在,则判断目标名的时间
是否是最新的。如果目标名的时间是最新的,则不执行其对应的目标指令,否则执行该条目标指令。
例子:
makefile文件编写如下:
var= inputInt.o add.o xixi: ls -l inputInt.o:inputInt.c gcc -c inputInt.c add.o:add.c gcc -c add.c libdemo1.so:$(var) gcc -shared -olibdemo1.so add.o inputInt.o main:libdemo1.so gcc main.c -omain -ldemo1 -L. .PHONY:clean clean: @rm -f main
1)make main
[fedora@localhost day02_r3]$ make main
gcc -c inputInt.c
gcc -c add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.
2)这时候如果再执行make main 指令,我们会看到以下信息:
[fedora@localhost day02_r3]$ make main
make: `main‘ is up to date.
3)如果我们删掉inputInt.o,再执行make main(删除add.o的现象是差不多的),这时候,我们会看到以下信息
[fedora@localhost day02_r3]$ rm inputInt.o
[fedora@localhost day02_r3]$ make main
gcc -c inputInt.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.
4)如果我们删掉libdemo1.so,再执行make main,这时候,我们会看到以下信息
[fedora@localhost day02_r3]$ rm libdemo1.so
[fedora@localhost day02_r3]$ make main
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.
5)如果我们删掉main,再执行make main,这时候,我们会看到以下信息
[fedora@localhost day02_r3]$ rm main
[fedora@localhost day02_r3]$ make main
gcc main.c -omain -ldemo1 -L.
5.建议:
只要有文件输出,就把任务作为一个目标,并且把输出的文件作为目标名。
6.潜规则(不建议)
.c目标与.o目标。
查找.o目标,目标不存在,就把.o替换成.c
如果.c存在,实施潜规则:直接调用gcc把.c执为.o
换一句话讲,所谓的潜规则就是,当作为依赖目标的.o文件不存在的时候,系统会自动的去找同名的.c文件是否存在,如果同名的.c文件存在,则系统会先将该同名的 .c 文件编译成 .o 文件.
例子:
1)先把当前目录中的inputInt.o 和add.o 文件删除,但保留inputInt.c 和add.c 文件
2)这时候的makefile文件如下所示(即这时候,环境中没有了libdemo1.so所依赖的.o文件):
var= inputInt.o add.o
xixi:
ls -l
#inputInt.o:inputInt.c
# gcc -c inputInt.c
#add.o:add.c
# gcc -c add.c
libdemo1.so:$(var)
gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
gcc main.c -omain -ldemo1 -L.
.PHONY:clean
clean:
@rm -f main
3)执行make main命令,这时候,你会在控制台中看到以下信息:
[fedora@localhost day02_r3]$ make main
cc -c -o inputInt.o inputInt.c
cc -c -o add.o add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.
其中的,
cc -c -o inputInt.o inputInt.c
cc -c -o add.o add.c
就是这里的潜规则的体现。。。
7.变量
变量名=值 值
$(变量名) ${变量}
8.伪目标:
不把目标作为文件处理的目标称为伪目标
声明伪目标
没有:
1.make的配置
2.make的变量的操作函数
3.多make文件使用
var= inputInt.o add.o #变量的定义 xixi: ls -l inputInt.o:inputInt.c #这里体现了目标依赖 gcc -c inputInt.c add.o:add.c #这里体现了多目标划分 gcc -c add.c libdemo1.so:$(var) #变量的使用,还可以通过${var}的形式进行使用 gcc -shared -olibdemo1.so add.o inputInt.o main:libdemo1.so gcc main.c -omain -ldemo1 -L. .PHONY:clean #这里是伪目标的定义 clean: @rm -f main #在目标指令之前加上@,这条目标走指令在执行的是偶不会再控制台中输出