🎁个人主页:我们的五年
🔍系列专栏:Linux课程学习
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
🍉一.make/Makefile的理解:
写成Makefile和makefile都是可以的。
先来看看百度百科的解释:
1.Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。
2.整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。极大提高了效率。
所以对于程序员来说,make/Makefile是很重要的。
本人的理解:
让我来解释一下就是,我们在项目中会生成很多目标文件,而且会生成很多次。如果我们不用make/Makefile,每次我们都要写依赖关系(需要的源文件,也就是要用哪个文件生成去生成新的文件),还有依赖方法(具体通过什么方法生成)。
如果我们在Makefile文件中(Makefile和makefile都可以,m可大写可小写),写好了 依赖关系和依赖方法,我们只需要写make+目标文件,就会直接生成我们需要的目标文件。如果只写make,目标文件省略,那么会生成第一个目标文件,也就是makefile文件最开始的文件。
🍉二.makefile文件的构成:
make是一条命令,makefile是一个程序。两者构成了可执行程序。
1.目标文件(target file)。
2.依赖文件(Dependent file)。
●目标文件和依赖文件构成了依赖关系 。
●目标文件在前,依赖文件在后,中间有:
写好这一套以后,我们直接保存退出 ,然后在命令行输入make test,就会根据依赖关系和依赖方法生成test文件。
发生错误时,make会直接退出。make会进行报错。
注:在依赖方法前面加上@,在使用make的时候,可以不让依赖方法回显。
例如:
makefile文件如下:
🥦不加@,就会回显依赖方法:
🥦加上@,就不会回显依赖方法。
🍉三 .更加规范便捷的用法写makefile文件:
🥥makefile文件中注释语句:
在语句前面加上#就可以注释语句
🥥首先是变量的使用:
变量的定义方法:
新名字=原文件的名字
例如:
target=test
depend=test.cpp
将上面的改完就是:
使用变量时,要使用$,可以理解为C语言的解引用。之后依赖文件和目标文件发生变动的时候,只需要在变量定义的时候改就可以了,这样比较方便。
🥥$@和$^的使用:
$@:表示所有的目标文件。
$^:表示所有的依赖文件。
如果有很多依赖文件时,我们就可以使用这个。这样在依赖方法中就不要写那么多的文件。
如下:
$@代表test
$^代表test.cpp
🍉四.对于伪文件和时间戳的理解:
伪文件:
🌽用途:
伪文件不会真正生成一个文件,伪目标文件一般用于对文件清理,安装,测试等用途。
🌽定义方法:
.PHONY:文件名称
这样就可以定义一个伪文件。
时间戳:
🌽查看文件的时间戳 :
stat 文件名称
可以查看文件的时间戳。
每个文件都会有时间戳这个属性,一切皆文件。
依赖文件和目标文件也会有时间戳。
make有一个特点,如果目标文件的时间戳比依赖文件新,就是时间在依赖文件后面,就不会新生产目标文件,而是提示up to data
这样的情况下,test的时间在test.cpp后面,就不会执行依赖方法。
相反伪文件不会生成真的文件,所以不会出现这种情况,可以一直执行make。
例如 :
只是到后面不会做什么事情而已。
🍉小测试:
我们可以用touch -m 指令更新时间戳,来判断是不是真的是根据时间戳来判断是否新生成目标文件。
从上面的例子我们就可以看出,在我们更新时间以后,又重新执行了g++ -o test test.cpp