make/Makefile使用介绍
make
是一个命令makefile
是一个在当前目录下存在的一个具有特定格式的文本文件
下面我们设计一个场景,实现make
命令对我们code.c
文件进行编译和删除。
1 #include<stdio.h>
2
3 int main()
4 {
5 printf("hello,world!\n");
6 return 0;
7 }
以下是makefile
的内容:
1 myexe:code.c //依赖关系
2 gcc code.c -o myexe //依赖方法
3 .PHONY:clean //clean是伪目标
4 clean: //可不写依赖目标
5 rm -f myexe //依赖方法
.PHONY
修饰的是伪目标,意思是总是被执行的,依赖方法总是会被执行,不会被任何情况拦截,想执行就执行。我们在命令行输入make
就可以对code.c
文件进行编译,生成myexe
可执行文件,make clean
就可以删除生成的可执行文件myexe
。现实中,有了依赖关系和依赖方法就可以描述清楚一件事情的原因和做法,达到我们的目标。
make
后面跟着目标,只有make
就会执行第一个扫描到的目标的依赖方法。如果我们连续两次make
就会发现报错。
原因是我们对code.c
编译过一次后并没有对原文件进行修改,重新编译也是浪费时间和资源,所以就不会再帮我们重新编译了。但如果我们对myexe
加上.PHONY
修饰的话,就可以无视拦截。
这种拦截可以提高编译效率,对于大型项目如果我们只修改了一个小文件就要把整个项目重新编译一遍就有点浪费时间了,这种情况下只需要重新编译修改了的文件即可。大部分情况下没问题,问题的产生不仅仅是修改新文件就能解决的,有些历史问题需要重新清理项目才能解决。
那么问题来了,编译器怎么知道我们有没有修改文件呢?
文件的ACM时间
一个文件有三种时间(文件=内容+属性)
关于ACM时间变化的细节:
touch [文件名]
可以在不更改内容的情况让文件的时间变成最新的。
make/Makefile拓展
推导性
变量
1 src=code.c //定义变量
2 target=myexe
3 cc=gcc
4
5
6 $(target):$(src) //&(变量名)
7 $(cc) $(src) -o $(target)
8 .PHONY:clean
9 clean:
10 rm -f myexe
其他
1 myexe:code.c
2 gcc $^ -o $@ //$^代表冒号右边所有文件,$@代表冒号左边所有文件
3 .PHONY:clean
4 clean:
5 rm -f myexe
1 myexe:code.c
2 @gcc $^ -o $@
3 @echo "编译文件"
4 .PHONY:clean
5 clean:
6 @rm -f myexe
7 @echo "清理文件"
以上语法拓展也可以组合使用。