快来用 make 与 Makefile 实现新年倒计时(Linux 篇)
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟
🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩
目录
前言
一、make 与 Makefile 的重要性🌟
二、make 与 Makefile 的基础概念📖
三、依赖关系剖析🔍
3.1 依赖关系的构建原理🎯
3.2 依赖关系中的错误处理🚫
四、项目清理机制🧹
五、关于make与makefile的一些问题😕
5.1 make指令为什么不能多次执行呢?
5.2 那么make怎么知道要不要再次编译呢?
六、Linux第一个小程序-倒计时🔥
6.1 回车换行
6.2 缓冲区
6.3 实现过程
总结🎉
前言
在 Linux 软件开发的广阔天地里,项目的自动化构建可是重中之重✨。make 工具携手 Makefile 文件,宛如一对得力助手,为开发者们提供了高效且灵活的项目管理与编译方式。
接下来,就让我们一同深入探索 make 和 Makefile 的奇妙世界吧🧐。
一、make 与 Makefile 的重要性🌟
会不会写 Makefile,从侧面反映了一个人应对大型工程的能力呢🤔。大型项目中,源文件数量繁多,还按类型、功能、模块分布在各个目录。而 Makefile 就像一位智慧的指挥官,通过定义一系列规则,精准安排文件的编译顺序、重新编译时机以及各种复杂操作,实现了超便捷的 “自动化编译”。只需轻松下达一个make
命令,整个工程就能自动编译,大大提升了开发效率,简直不要太赞👍!
二、make 与 Makefile 的基础概念📖
make
是个命令工具,专门负责解读 Makefile 里的指令。不同的 IDE,像 Delphi、Visual C++,还有 Linux 下的 GNU,都有类似的功能,这让 Makefile 成为工程编译的常用方法。简单来说,make
是负责执行的命令,Makefile 则是记录编译规则和指令的文件,二者紧密配合,完成项目的自动化构建🤝。
我们先看看make与makefile的相关操作👇:
以下写法也可以👇:
三、依赖关系剖析🔍
以一个简单的 C 语言项目为例,看看下面这个 Makefile 片段:
在这里,mycode
依赖mycode.o
,mycode
.o
依赖mycode
.s
,mycode
.s
依赖mycode
.i
,mycode.i
又依赖mycode.c
。这种依赖关系构成了一个清晰的层次结构,make
工具就依据这个来确定编译顺序🧐。
3.1 依赖关系的构建原理🎯
make
开始工作时,会先在当前目录找 “Makefile” 或 “makefile” 文件。找到后,它会把文件里的第一个目标文件,比如上面例子中的 “mycode
”,当作最终目标(make的默认操作)。要是目标文件不存在,或者它依赖的文件比它新,make
就会执行相应命令来生成目标文件。比如mycode
不存在,且mycode.o
比mycode
新,make
就会执行gcc mycode.o -o mycode
生成mycode
。要是mycode.o
也不存在,make
会接着找mycode.o
的依赖关系并按规则生成,就像剥洋葱一样,一层一层,直到编译出第一个目标文件😃。
3.2 依赖关系中的错误处理🚫
在寻找依赖关系的过程中,如果出了问题,比如找不到被依赖的文件,make
会直接罢工并报错。但对于命令本身的错误或者编译失败,make
通常不会管,它只专注于文件的依赖关系。要是依赖的文件找不到,make
就不干啦😒。
四、项目清理机制🧹
项目开发过程中,清理旧的目标文件和中间文件很有必要,这样才能重新编译。看下面这个例子:
这里的
clean
目标没有和第一个目标文件直接或间接关联,它定义的命令不会自动执行。不过,我们可以手动执行make clean
,来清除所有相关目标文件,为重新编译做准备。一般我们把clean
设为伪目标,用.PHONY
修饰。伪目标的特点是,不管它依赖的文件啥情况,都会被执行,保证清理操作稳稳当当✅。
五、关于make与makefile的一些问题😕
5.1 make指令为什么不能多次执行呢?
原因是要提高编译效率
5.2 那么make怎么知道要不要再次编译呢?
make怎么判断源文件的新旧?
- ⭐只需要比较,可执行程序的最近修改时间 和 源文件的最近修改时间
- 如果可执行程序(.exe)新于 源文件(.c)那么源文件是老的,不需要重新编译
- 反之,则需要重新编译
查看时间的指令 : stat
- Access:表示访问的时间
- Modify:表示文件内容修改的时间
- Change:表示文件属性修改的时间
我们可以用 touch 命令更新时间
因此,make命令并不是总是执行的,要根据可执行程序 与 源文件的新旧
如果想总是执行make命令,那么就要在makefile文件中 用.PHONY
修饰。
六、Linux第一个小程序-倒计时🔥
学到目前为止,让我们实现一个程序吧~
我们先来谈谈下面俩点
6.1 回车换行
回车是让光标到最左边,换行是进入下一行
6.2 缓冲区
我们发现等了2秒后,才打印结果
因此,缓冲区就是由C语言维护的一段内存
强制刷新
6.3 实现过程
- 先创建以下文件
- 在文件中写入基本信息
- 创建makefile,写入信息
- 实现代码
总结🎉
make 和 Makefile 为 Linux 项目的自动化构建提供了强大支持。通过合理设定依赖关系和规则,开发者能高效管理项目编译过程,提升开发效率。项目清理机制又能保持开发环境整洁,方便新的编译和调试。深入理解 make 和 Makefile 的原理,对开发大型复杂的 Linux 项目至关重要,是 Linux 开发者的必备技能💪。掌握这些工具,让我们在软件开发的路上更加游刃有余,轻松应对各种挑战吧!
如果在学习过程中有任何疑问或建议,欢迎随时交流分享哦😉! 👉【A Charmer】