伪目标是可以总是执行的,只要make 依赖文件就行, 就像图片中make clean后就会执行rm -f mytest文件
因为如果源文件不改的话,make会显示没有更新,第二次就会失败。 我们在依赖关系前面加上
.PHONY:目标文件
这样就解决了makefile只能构建,不更新无法执行的问题。 可以把.PHONY看作总是执行的。
这样我们创建一个文件后
两种方式
make 指定文件 make
第一种可以形成指定文件,比如make clean 第二种是自上向下扫描形成第一个文件
文件=内容+属性
内容更改modify就会更改, 属性更改change就会更改。
acceess是最近访问时间 touch 文件名 可以更新M时间。 上面makefile对比更新时间就是M时间,就是修改时间。 echo会回显,前面加@就会取消回显。
根据上篇文章我们知道了文件的编译过程是由iso临时文件编译的可执行程序生成的。如下图。 最后也可以省略中间的部分写成
gcc test.c -o mytest
我们make最后看到的编译过程
这就是一个压栈的过程,先写的语句不执行,没找到依赖文件就一直压栈,找到最后找到了,就出栈。
我们通常用编译文件形成可执行程序的时候我们都是拿好多的.c文件编译成.o文件和库文件(暂时不提)和在一起链接成可执行程序。
这样我们形成了通用的makefile
根据上面的我们可以写成一个模板 这样我们就不要频繁的改所有文件名了
上面的定义类似于c++中里的宏。
但是这样还是不通用,万一我们源文件有多个怎么办?
有两种方法
这样就能拿到所有的.c文件。
下面拿到所有.o文件 ^是拿到所有OBJ里的文件 @是拿到所有BIN里的文件 编译过程写为 %是通配符匹配内容
最后这个版本就是最通用的,单个多个文件都适用 注意这里@是目标文件,第二个依赖关系省略了 -o (OBJ)