伤心客 发表于 2024-9-30 23:36:26

初识Linux · 有关makefile

目次
媒介:
1 makefile的简单使用
2 makefile介绍
媒介:

我们上文介绍了gcc和g++的基本使用,带了许多的子指令,但是有的时候啊,一个一个敲指令确实有点麻烦了,此时,一个工具就能派上用场,即主动化工具makefile。
我们不妨理解为语言中的宏,下令的重新命名都可以通过makefile来表示,这就大大简化了工程量了,所以,有的时候makefile的使用从侧面也决定了工程的完备程序以及效率题目。
通过简单的介绍,我们知道了makefile是一个主动化下令工具,那么使用方法第一个是要创建makefile文件,makefile大概是Makefile都可以,我们在文件里面写入一些指令加上一点操作,我们就可以实现主动化指令了。
1 makefile的简单使用

我们不妨,先看看makefile的简单使用:
https://i-blog.csdnimg.cn/direct/b9a775adb0384e03ad4e39c61a69d91e.png
第一步是创建一个makefile文件并往里面写入一些指令->后面会介绍。
https://i-blog.csdnimg.cn/direct/3517b86c07be4dfc89a6c6b74364a8ec.png
第二步则是先来一个实例代码:
https://i-blog.csdnimg.cn/direct/77b7d2e8ac0e4aec924ebed44777ddd9.png
https://i-blog.csdnimg.cn/direct/02a3cf7162af4e32baa21141fcb2d182.png
然后,我们直接make一下,就可以创建一个test的可实行文件了,我们实行也是没有题目标:
https://i-blog.csdnimg.cn/direct/6ae152acbeb54badb790b9e080bbe8c5.png
https://i-blog.csdnimg.cn/direct/93ce40207c1e4019b9b81fdd3fa61767.png
此中,clean指令也是可以完成我们的预期操作的。
2 makefile介绍

我们从makefile文件中的第一个点开始:
https://i-blog.csdnimg.cn/direct/f67bf5d464de4362a389c19e3c0e62a2.png
第一行的test:test.c,此中test:test.c成为构成了依赖关系,test叫做目标文件,test.c是被test依赖的。
此中:后面的叫做依赖文件列表,不同的依赖文件可以用空格进行分割,也可以为空。那么下面的指令就是依赖方法,依赖方法前面只能使用Tab来空位置,不能使用四个空格,会报错。
这的理解我们可以理解为父子,儿子问父亲要钱,这里面存在父子之间的依赖关系,依赖方法是养育,所以给钱。
那么我们如果重复使用该下令呢?
https://i-blog.csdnimg.cn/direct/7161528d65ae432f8d4dfdcfa627586b.png
它第一次是成功实行了的,但是后面就告诉说,test is up to date,表明test文件已经是最新文件了。
此时,前面文章埋的伏笔就可以拉出来了->文件的ACM时间。
我们首先看看test.c的ACM时间:
https://i-blog.csdnimg.cn/direct/dc309dac1a0f4fa18378ad416c2c6c1f.png
这里为什么不让多次实行编译的下令就是因为makefile工具比力的是源文件和可实行文件的ACM时间,如果可实行文件和源文件的ACM时间,在修改上有差别,make检测到源文件更新了,才会重新编译源文件,如许做的目标是提高效率,比如不能总一直编译已经编译好了的文件吧。
以及,不同的主动化工具对于时间的判断是不一样的,比如我们平时使用的VS,有的时候出现bug,重新清理一下办理方案,再运行就可以了,大多数就是因为时间的判断准则出现题目了,此时清空办理方案就是为了更新一下可实行文件的ACM时间,一比力,欸源代码早一点,重新编译就成功了。
但是,前面我们介绍了一个指令叫做touch,是用来创建文件的,好像在这里没有啥用处,但是使用touch可以改变ACM时间:
https://i-blog.csdnimg.cn/direct/04ed1ec6919943bdbaa3f130107a94b1.png
所以我们想要重复编译也可以使用touch改变ACM时间再进行编译即可。 
此时,再引出一个关键词,.PHONY:
https://i-blog.csdnimg.cn/direct/fc03f814e9e54ba397ecc06c49948722.png
我们会发现clean总是可以实行的,这就是.PHONY做的事,被.PHONY修饰了的指令,默认可以重复实行,所以我们可以重复实行,那么我们同样可以把.PHONY给test修饰了https://i-blog.csdnimg.cn/direct/6b4405746c4c47699a50f6b175965f74.png
https://i-blog.csdnimg.cn/direct/5c02e917a92f4100a83267df60608c71.png
就可以重复编译了,此时clean也是可以重复实行的,因为clean是特别的方法,后面也不消跟任何东西:
https://i-blog.csdnimg.cn/direct/c8d70f4315bc4e9eb3c21eac4d71c5b2.png
那么如今来穷究原理部分,为什么我们直接make是实行的第一个指令呢?
因为makefile实行方向就是从上往下进行实行的,所以我们直接make,默认实行的是第一个指令,那么我们换个位置:
https://i-blog.csdnimg.cn/direct/0a36b3ee3fcc41a491ca36df23213175.png
https://i-blog.csdnimg.cn/direct/87cfa9e1b3d74438a94ccc25e50447b7.png
此时make就是实行的第一个语句了。
此时啊,学到这里,不免会觉得我每次使用指令都要给我打印出来,一点神秘感都没有,能不能不打印呢?
当然是可以的,此时用到的符号是@,@恣意的指令,就能让指令不表现出来:
https://i-blog.csdnimg.cn/direct/d786b0ac7dcd48a4b92d360c96879088.png
https://i-blog.csdnimg.cn/direct/6a81e5869a0241d78572abb9155f197d.png
此时make了一下之后,rm -rf之后也没表现:
https://i-blog.csdnimg.cn/direct/72ab3f23ab8f4d48a46bbe1faf51e1b3.png
此时同理。
 https://i-blog.csdnimg.cn/direct/bb5c090431a44f9c998c8de1f66ae15f.png
https://i-blog.csdnimg.cn/direct/96314a5bb26b411fb39c8d52057c3e2b.png
所以@是只能应用一个指令,不是多行的,此时对echo@一下就可以了:
https://i-blog.csdnimg.cn/direct/06703c6763ac4fa9bda0dfacb4c14c12.png
 这里还有一个有意思的点是,makefile里面的注释是#,而且允许变量的存在,虽然说是变量,但是实际上就是宏了:
https://i-blog.csdnimg.cn/direct/8aa336331eb34e42ba13a0ae14b3414b.png
实行的操作实际上就是更换。
https://i-blog.csdnimg.cn/direct/8ba64a9769834c3e9ecfe94f593658ee.png
但是如许使用就会导致如上错误。
须要搭配$使用:
https://i-blog.csdnimg.cn/direct/36964f76521f4782b23cf3e9ae1ab111.png
https://i-blog.csdnimg.cn/direct/e396f186310149628d68e9162175a215.png
此时就没题目了。
这里涉及了更换,我们不妨再看看$@ $^:
https://i-blog.csdnimg.cn/direct/5591fd076cb44a7c8dcef9ee081a715e.png
https://i-blog.csdnimg.cn/direct/3db12547aad64e1d9aaf20f05f038b6d.png
不丢脸出,$@ $^分别取代的是目标文件和依赖文件。
好了,如今又提到了依赖关系,那么,我们看一段代码:
https://i-blog.csdnimg.cn/direct/553efcdf951c4ea09c95ed466bd3d321.png
https://i-blog.csdnimg.cn/direct/81eb4760572e4dacbc2fe38455b9b0e5.png
我们不难发现依赖关系是连着的,所以我们可以直接创建编译的三个阶段的文件。
那么既然依赖关系是连着的,试试打乱顺序呢?
https://i-blog.csdnimg.cn/direct/f00086123c954c35a5d19f1c7fa32018.png
 https://i-blog.csdnimg.cn/direct/e029297e173c46d9b18b70b41d346e98.png
可以发现,还是可以创建,岂非是说随意打乱顺序都没有题目标吗?
当然不是;
https://i-blog.csdnimg.cn/direct/208c7e70e163484098c00580fca59e68.png
https://i-blog.csdnimg.cn/direct/4d11887b85834838aa81b553a43212cf.png
此时只能创建预处置惩罚期间的文件,可实行文件就创建不了了,凡事都要有一个带头的不是,所以可实行文件要放最开始: 
感谢阅读!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 初识Linux · 有关makefile