make是一个Linux系统内置的命令;
Makefile是一个需要工程师自己建立的的一个文件!
code:code.c
gcc -o code code.c
.PHONY:clean
clean:
rm -f code
上面这段代码中各自代表什么含义呢?
可以看到程序写完后,进行make时第一次没问题,但是多次make后会显示已是最新的,不能重新编译;但我们进行make clean时却可以无限次,这是为啥呢?
可以发现,clean的左边加上了 .PHONY ,这是什么意思呢?
.PHONY表示:被修饰的目标是一个伪目标,且伪目标总是被执行的。
啊?伪目标总是被执行是什么意思呢?由小编带着大家一步步解析。
要理解被执行,我们可以从总是不被执行作为切入点。
上图中多次make不会再次编译,这就是不被执行。那它又是如何做到不被执行的呢?
在指令章节介绍了stat指令,它可以列出一个文件的访问、内容修改、属性修改时间。
在下图中,我们对一个未修改文件进行修改时,其文件内容最近修改时间发生了变化,此时可以重新make了。
因此,不被执行是根据文件内容最近修改时间与exe时间对比来决定是否需要重新编译 !
那么,总不被执行即是忽略exe和文件内容最近修改时间对比。
结论:.PHONY:让make忽略源⽂件和可执⾏⽬标⽂件的M时间对⽐! 最佳实践:可执行程序,不需要修饰成.PHONY,clean修饰成总是被执行!
上面这种方式是一步到位的,能否像gcc那样生成 .i , .s , .o 的临时文件呢?可以的。
myproc:myproc.o
gcc myproc.o -o myproc
myproc.o:myproc.s
gcc -c myproc.s -o myproc.o
myproc.s:myproc.i
gcc -S myproc.i -o myproc.s
myproc.i:myproc.c
gcc -E myproc.c -o myproc.i
.PHONY:clean
clean:
rm -f *.i *.s *.o myproc
根据上面这段程序及make工作规则进行解析:
简单而言 make/makefile 只默认形成一个目标,就是从上到下遇到的第一个目标,并根据依赖关系寻找,如果没有找到依赖关系就会报错,直到找到源文件为止。
但上面这种方法在实践中并不经常使用,像 .i .s 这种临时文件一般是不需要保留的,在vs上也是这样处理的,只保留 .o文件和 可执行程序。因此Makefile的最佳实践如下所示
code:code.c
gcc -o $@ $^ //$@ 代表:左边部分 $^代表:右边部分
.PHONY:clean
clean:
rm -f code
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有