0. 概述
0.1 上次回顾
第一个学习笔记中,介绍了我的makefile测试环境之外,主要讨论了在编译c文件的情况下,记录了这么几个问题:
1. makefile的基本格式(好像也叫显示规则,目前还没有深究)
2. makefile里在写个clean规则(那里的写法好像不是很规范,回头学习到更多知识的时候再更新)
有兴趣的朋友可以参考一下:Makefile学习笔记-第一个Makefile文件_Brook博客栏-优快云博客
0.2 本期预告
这一次主要针对其他的几个方面去讨论“
1. makefile规则的名字,其实很有用(检测文件的新旧)
本文的学习材料来自b站视频,欢迎前去围观:【c语言】11.如何编写Makefile文件_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
1. 规则的名字,其实很重要
首先还是和上次一模一样源c文件(文件名hello.c):
#include <stdio.h>
int main(void)
{
printf("Hello world\n");
return 0;
}
第一个makefile是这样写的:
Hello : hello.c
gcc hello.c
在执行make后,执行了make后,如愿的出了一个a.exe的程序。再执行make的时候,程序会被再次执行一次。那问题来了,如果我真的有一个成百上千的工程,每次都全盘来一次的话,太慢了!再这个视频里,我找到了突破口!
首先,复习一下makefile的一个简单的规则:
target: source file
command
其中的target指的我要生成的目标文件!然而再上次的案例中,给的是Hello,最终我要的是a.exe,这两个差的太多,这也就是为什么每次执行make的时候,程序都会被编译一下!因为我要的和我规定的其实不一样!如果一样的话,会是什么结果呢?我们稍微调整一下这个makefile,再来看看效果。新版的makefile如下所示:
Hello.exe: hello.c
gcc hello.c -o Hello.exe
gcc命令中,-o命令的作用可以理解为给生成的文件指定一个文件名。再这里,最终输出的文件名和target是一样的!接下来我们连续执行两次make来看一下效果:
通过上面的例子我们知道一点:这个target是要拿来做文件对比的!至于make是如何知道我这个编译好的文件是不是最新的,对比一下文件的时间戳,一目了然!
那么问题来了,如果我跟新了我的这个hello.c的源文件,make会重新给编译一个新的Hello.exe出来吗?为此,hello.c又被改回了之前的模样:
新版hello.c:
#include <stdio.h>
int main(void)
{
printf("Hello world\n");
printf("Hello China\n");
return 0;
}
文件保存后,再次运行make,果然,给重新编译了!依旧,第二遍执行make的时候,提示文件是最新的!
所以说,这个target文件是确实有用的! 还有什么其他作用呢? 以后学到了继续分享。
2. makefile文件本身的名字
2.1 开头m可大可小
再在之前的文章里,我用的makefile开头一直都是小写,每次运行make的时候,make也会自动找到当前文件下的makefile文件。那么如果把开头的m大写,可以吗?
首先删掉已经编译好的Hello.exe文件,然后单独的改下这个makefile的文件名为大写的Makefile,然后make下看看:
一切正常!