Linux学习之makefile

写在前面:

我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久,结果因为不会安装VMware就无疾而终了,可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假(那个时候刚刚过完考试周),我没什么事做就又重拾Linux,不服输的我选择再战Linux,这一次学习还算顺利,虽然中间有些小插曲但是不影响整体学习进度, 我看着B站上的视频一点点学习Linux,基本上把Linux的基础指令学完了。学完之后我又遇到问题了,视频基本上到这就结束了,而我却不知道下一步该学什么,于是就没怎么碰Linux,结果没过多长时间我就把学的Linux指令忘的一干二净。现在是我第三次学习Linux,我决定重新开始学Linux,同时为了让自己学习的效果更好,我选择以写blog的形式逼迫自己每天把学习到的Linux知识整理下来。这也就是我写这个系列blog的原因。


makefile的基础规则

makefile:项目管理
命令:makefile or Makefile —make命令

  • 一个规则
    目标:依赖条件
    (一个tab缩进)命令
    1. 目标的时间必须晚于依赖条件,否则,更新目标。
    2. 依赖条件如果不存在,寻找新的规则去生成依赖条件。
  • 两个函数
    1. src=$(wildcard ./*.c):寻找当前目录下的所有.c文件,将文件名组成列表,赋值给变量src
    2. obj=$(patsubst %.c %.o $(src)): 将参数3中所有包含参数1的部分替换成参数2
  • 三个自动变量
    1. $@:在规则的命令中,表示规则中的目标。
    2. $^:在规则的命令中,表示所有的依赖条件。
    3. $<:在规则的命令中,表示第一个依赖条件。如果将该变量应用于模式规则中,它可将依赖条件列表中的依赖一次取出,套用模式规则。
  • 模式规则
%.o : %.c
	gcc -c $< -o %@
  • 静态模式规则
$(obj) : %.o : %.c
	gcc -c $< -o %@
  • 终极目标:
    ALL : 最终的目标
  • 伪目标:
    .PHONY: clean ALL
  • 清除:
clean : (没有依赖)
	-rm -rf $(obj) a.out

-的作用的删除不存在的文件不报错,顺序执行结束。

  • 一些参数:
    • -n:模拟执行make make clean命令
    • -f: 指定文件执行 make命令

上机操作

第一版

  1. 编写nakefile文件
    1

makefile 的依赖的从上至下的,换句话说就是目标文件是第一句里的目标,如果不满足执行依赖,就会继续向下执行。如果满足了生成目标的依赖,就不会再继续向下执行了。make 会自动寻找规则里需要的材料文件,执行规则下面的行为生成规则中的目标。

  1. 执行make命令
    2
  2. 执行生成的test
    3

第二版

  1. 我们上点强度,修改下test,修改后需要多文件联合编译。
    1
  2. 此时就要联合多文件编译,我们先从简单的来,先想想我们在之前用gcc是怎么写的,我们就怎么写到makefile
    2
  3. 执行make
    3

第三版

在实际开发中,有可能add.c会有些许改动。但是如果是第二版的话,我们就要把所有的文件都在编译一遍,这非常浪费时间,非常蠢。之前我们学到编译的四个步骤中第二步是最好时间的,所以我们可以把步骤拆分。

  1. 修改makefile ,将步骤拆分
    1
  2. 修改add.c,看实际效果
    2
    我们可以看到修改add,c之后,我们再make就只是把add.ctest.o add.o sub.o mul.o div1.o再重新编译了一下,这就节省不少时间。

原因
makefile 检测原理:修改文件后,文件的修改时间发生变化,会出现目标文件的时间早于依赖文件的时间,出现这种情况的文件会重新执行规则,重新编译。例如上面,我修改add.c后,add.c 的文件时间就晚于add.o,这种情况下就重新编译生成add.o,而其他文件时间符合,就不变。


第四版

有童鞋可能会问我们之前介绍的函数还没有发挥作用,别急,接下来我就为你介绍怎么把函数用到makefile里面。

  1. 修改makefile,使用函数
    1

src = add.c sub.c mul.c div1.c
obj = add.o sub.o mul.o div1.o

  1. 执行make
    2
  2. 执行./test,效果和之前和一样,我这里就不演示了。

pay attention: 在使用wildcardpatsubst 函数参数之间不要随便加空格,严格按照我的格式来。(因为我一开始学的时候,我多加了个空格,结果debug了半天,心态差点炸了)


第五版

先来重温一下前面讲的三个自动变量

  • $@:在规则命令中,表示规则中的目标
  • $^在规则命令中,表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复项,则去重
  • $<::在规则命令中,表示规则中的第一个条件,如果将该变量用在模式规则中,它可以将依赖条件列表中的依赖依次取出,套用模式规则
  1. 修改makefile,使用三个自动变量
    1
  2. 执行make
    2
  3. 执行./test,效果和之前是一样的,我这里就不展示了。

sub,add 这些指令中使用$<$^都能达到效果,但是为了模式规则,所以使用的$<


第六版

很多人以为第五版是最终版,但其实不是,因为第五版的可拓展性太差了,比如在加一个功能(如取模运算)的函数就需要再增加取模函数部分,这很蠢,所以,模式规则来了。

  1. 修改makefile,套用模式规则。
%.o : %.c
	gcc $< -o $@

1

  1. 执行make,执行生成的文件。
    2
  2. 添加一个运算,取模。我们只需要写好源代码,修改test.c,然后直接make即可,不用改makefie,这就很nice
    3

第七版

第七版是对第六版的优化,以后文件集合会有很多,我们就需要指定哪个文件集合使用哪个规则,这就要用到静态模式规则。

  1. 修改makefile,指定模式规则给obj用。
    1

写在最后

个人亲身经验:我们学习的一系列Linux命令,一定要自己亲手去敲。不要只是看别人敲代码,不要只是停留在眼睛看,脑袋以为自己懂了,等你实际上手去敲会发现许许多多的这样那样的问题。正可谓“键盘敲烂,月薪过万


如果你觉得我写的题解还不错的,请各位王子公主移步到我的其他题解看看

  1. 数据结构与算法部分(还在更新中):
  1. Linux部分(还在更新中):

✨🎉总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
在这里插入图片描述
如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉

  • 33
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux命令和Makefile是计算机科学中非常重要的两个主题。学习这两个主题可以帮助我们更好地理解操作系统和软件开发过程。 在学习Linux命令方面,我们需要掌握一些基本的命令,如ls、cd、mkdir、rm等,以及一些高级命令,如grep、awk、sed等。这些命令可以帮助我们在Linux系统中进行文件管理、文本处理、进程管理等操作。 在学习Makefile方面,我们需要了解Makefile的基本语法和结构,以及如何使用Makefile编译和构建软件项目。Makefile可以帮助我们自动化构建和管理软件项目,提高开发效率和代码质量。 学习Linux命令和Makefile可以通过实验来进行。我们可以在Linux系统中使用命令行界面进行实验,或者使用虚拟机来模拟Linux环境。在实验中,我们可以通过编写脚本和Makefile来自动化执行一些任务,如编译和运行程序,处理文本文件等。 总之,学习Linux命令和Makefile是非常有用的,可以帮助我们更好地理解计算机系统和软件开发过程。 ### 回答2: Linux命令是指在Linux系统下使用的命令行工具,它是Linux系统管理的重要组成部分,也是程序员工作的必备工具之一。学习Linux命令,需要掌握Linux系统的基本架构和操作逻辑,并且要了解常用的命令工具的使用方法,例如cd、ls、grep、chmod等等。在学习过程中,可以先从命令的基本语法入手,逐步深入到各种实用技巧和高级用法,例如管道操作、正则表达式和shell脚本编程等。可以通过参考相关书籍、在线教程和实践操作来提高自己的Linux命令水平。 Makefile是一种用于自动化构建和编译程序的工具,它可以定义程序的编译规则和依赖关系,并且可以根据这些规则和关系自动化执行编译和构建的过程。在学习Makefile的过程中,需要先了解基本语法和规则,例如目标、依赖和命令等等。接着需要学习如何定义和使用变量、宏和函数等高级特性,以及如何引入外部文件和库的支持。学习Makefile还需要掌握一些调试和优化技巧,例如使用Makefile的自带参数和规则等功能。通过不断实践和实验,可以提高自己的Makefile技能,掌握快速开发和构建程序的能力。 在进行Linux命令和Makefile学习的实验中,可以选取一些具有实际意义的任务,例如编译和运行一个C程序、构建和打包一个JavaScript库、或者使用Makefile对一个网站进行自动化发布等等。在实验中需要注意掌握一些基本的工具和技巧,例如文本编辑器的使用、版本控制工具的使用、Debug工具的使用等等。同时需要注重实验的记录和归纳,例如记录遇到的问题和解决方法、维护Makefile的文档和注释、整理并分享实验的心得和体验等等。通过实验的逐步深入和内容丰富,可以提高学习的效率和成果。 ### 回答3: Linux是一种自由配置和自由使用的操作系统,这种自由是指用户可以自由地获取、使用、复制、学习、修改和分发Linux及其相关软件的权利。对于学习Linux命令,我们可以从以下几方面入手: 1.基础命令:例如cd、ls、mkdir、cp、mv、rm、cat、tee、grep、awk等等。这些命令是 Linux 常用的命令,掌握了这些基础命令的使用方法,可以让我们更好地理解操作系统。 2.管道和重定向:管道和重定向是Linux命令中非常重要的一部分,例如用“|”将命令串联起来,或者使用“>”将输出重定向到文件中等。这些操作能够非常方便地对命令的输出进行处理,从而提高我们的工作效率。 3.shell脚本编程:shell脚本是一种可以自动化完成一系列操作的脚本语言,通过学习shell脚本编程,我们可以更加高效地完成重复性的工作。例如,同时部署多台服务器、修改配置文件等。 随着开发环境的复杂,makefile是一个非常重要的工具。Makefile是一个文件,其中包含有关如何编译和链接程序的信息,它可以基于文件之间的依赖关系进行操作。通过学习makefile,我们可以了解文件之间的依赖关系,从而实现更快速、更高效的编译和构建项目。 学习makefile的步骤如下: 1.了解makefile的语法:makefile主要有三个元素:变量、目标和规则。变量用于定义需要使用到的路径、编译器等信息,目标表示需要构建的主要目标文件,规则定义了如何生成目标文件。 2.编写makefile:在掌握makefile的语法后,我们需要开始动手编写makefile。我们可以从自己的项目中入手,判断项目中不同文件之间的依赖关系,并编写makefile来自动化构建这些文件。 3.调试makefile:在编写makefile时,难免会出现语法错误或者逻辑错误,因此我们需学会调试makefile。我们可以通过命令行参数和makefile内置函数进行调试。 总的来说,Linux命令和makefile学习都需要付出较多的时间和精力,但可以帮助我们更好地理解和使用Linux系统,提高我们的工作效率,值得一生投入。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值